《30天自制操作系统》学习笔记——第十天_cer_ml的博客-程序员ITS203_(size + 0xfff) >> 12;

技术标签: 《30天自制操作系统》学习笔记  

       到第十天,很高兴啊,已经完成了大概三分之一的内容了!感觉写这个笔记,对自己还是很有用的。平日里看这种书,难免赶进度,草草浏览过。但是也因为要写笔记的因素,看得会相对认真一点。在回顾的时候看看自己以前的笔记,就会更快理清思路。      

                                            

       今天一开始,还是要继续昨天的内存管理内容。说来,对于内存管理这块,我还是真有点意犹未尽呢,接下来在后面还会继续有涉及。闲言少叙,进入正题。继续优化内存管理。我们昨天在方法三、四中讨论了如果可用内存小而多而散的情况,届时管理信息不够用。那么我们现在采用一种向上舍入的方法(roundup)。我们编写一些函数,把内存的大小按0x1000字节为单位向上舍入。这里引用一下源程序:

unsigned int memman_alloc_4k(struct MEMMAN *man, unsigned int size)
{
	unsigned int a;
	size = (size + 0xfff) & 0xfffff000;
	a = memman_alloc(man, size);
	return a;
}

int memman_free_4k(struct MEMMAN *man, unsigned int addr, unsigned int size)
{
	int i;
	size = (size + 0xfff) & 0xfffff000;
	i = memman_free(man, addr, size);
	return i;
}


       请看这句:

        size = (size + 0xfff) & 0xfffff000;

       现将size加上0xfff,再将末尾三位置零?这么做是什么效果?这就是roundup!若size形如abc000,则结果就是abc000,若size形如abcxxx,也就是末三位不全为0,则结果为ab(c+1)000。这个结果正好符合roundup的定义,非常巧妙。但是常规的方法如下:向下舍入:i = i & 0xfffff000   ;向上舍入:if ((i & 0xfff) != 0) { i = ( i & 0xfffff000 )+0x1000; }

       常规方法虽然很好理解,但是却慢。因此采用最上面的方法。

       


       接下来讲今天的第二个很重要的东西——sheet图层。采用原书的截图:

       因为前面的鼠标还有一个大毛病:它像一块橡皮擦,走到哪把原图都破坏了。因此引入sheet的概念,在后面的窗口中也会有很多应用。值得一提的是,关于图层的程序开发,作者也是经历了一个不那么顺利的过程。基本上是这个思路:当前什么需求,只要完成这个需求就可以了,后期再有别的需求的时候,或者发现了缺陷,再一步步改进。了解这样的一个过程才能真正知其然,并且知其所以然。鼠标的问题如何解决?如果鼠标的背景色是透明色就好了!好的,就照这个思路,我们建立了第一个管理多重图层的结构:struct SHTCTL。这里需要着重解释其中的一个参数top。top代表最上面图层的高度。那么什么是高度呢?显示器像素坐标,横为x,竖为y,可以想象存在一个z,垂直于屏幕,向外指。高度最大的那张图层,就是能够完全显示在屏幕上的那张图层,你可以理解成鼠标。而高度最低的图层,那就是背景桌面了吧。具体的SHTCTL的结构,请看下图:


       对于sheet的操作,重要的函数有完成调整图层高度关系的updown函数,还有让图层左右上下移动的slide函数,还有refresh刷新函数。updown的数据结构操作就像对队列进行元素的插入,不同点是该元素本就是属于队列的。slide函数很简单,只用把图层的新的位置坐标赋予图层即可。refresh函数需要着重说明。最初的refresh函数思路很简单:只要把所有图层从下到上都画出来不就行了,而透明色的思想如何体现呢?例如鼠标,我们不想显示鼠标的背景色,只要把该色设为背景色,然后做一个if判断,若果该像素等于背景色,则不再往上画。透明背景的问题解决了,但不觉得这种刷新方法很没必要嘛?首先说没必要在哪呢?鼠标指针最多只有16*16的像素,若稍微一动,就要刷新320*200=64000个像素,非常的没必要吧。

       接下来进行改进,所说改进,但是刷新的思路还是在那,就是从头到尾一张张画,只不过刷新范围减小了。新的refreshsub指定刷新范围,此处的范围用两对绝对坐标,即屏幕上的显示坐标来表示。根据新的refreshsub再写新的refresh。注意,新的refresh完成的功能是,指定图层,以及相对坐标(相对于指定图层的坐标),然后刷新。为什么是相对坐标呢?因为往往我们知道一些图像在图层中的坐标,却不知道在屏幕上的坐标,那要进行计算,就把计算交给程序进行吧。

        但是呢,即便这样,refreshsub还得改进。作者还真是自我要求高呀。但这里就不说了,因为不是很重要。

        好了,今天的内容结束了!期待明天的笔记!!!


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011879578/article/details/19689523

智能推荐

STM32无源蜂鸣器播放音乐_这些年写的代码=屎山的博客-程序员ITS203_stm32蜂鸣器音乐

目录1.STM32产生PWM波驱动无源蜂鸣器使其发声2.音乐播放原理3.音乐文件制作(播放自己喜欢的音乐)4.用蜂鸣器播放音乐1.STM32产生PWM波驱动无源蜂鸣器使其发声1)查看原理图,找到对应引脚(我这里时PA1)2)打开CubeMax,输入自己芯片的类型确定后,配置好系统时钟RCC,我这里是80Mhz,找到相应引脚PA1设置为GPIO_Out...

Java下载安装和配置环境变量_猪爸爸爱学习的博客-程序员ITS203

如果本文对你有用,还请点个赞,提高排名,帮助更多的人,谢谢大家!一、简介这篇教程的标题写的是“Java下载与安装”,实际上安装的是JDK和JRE。JDK是Java Development Kit的缩写,顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含...

django查询的多种方法(模糊查询,时间的查询)_rennan…的博客-程序员ITS203_django模糊查询

User.objects.filter(字段__) # 俩下划线__exact 精确等于 like ‘aaa’__iexact 精确等于 忽略大小写 ilike ‘aaa’__contains 包含 like ‘%aaa%’__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。__gt 大于__gte 大于等于__lt 小于__lte 小于等于__in 存在于一个list范围内__st

windows安装omnet和sumo、veins_晚上睡觉的猫头鹰的博客-程序员ITS203

一、omnet安装参考如下:https://blog.csdn.net/weixin_41286835/article/details/101101603注意:windows上安装omnet不需要安装java或者Mingw,omnet的包都自带有(若侵犯删除)二、sumo安装1:sumo不需要安装,只需要找到对应的windows安装包就可以,在bin文件夹下面有sumo-gui.exe文件,可直接运行。如果要在shell运行netedit之类的命令,可以在环境变量中添加bin文件夹的目录。

IPv6 tutorial 1 Get started now_weixin_33921089的博客-程序员ITS203

https://4sysops.com/archives/ipv6-part-1-get-started-now/You’ve probably heard the news that the Internet is in trouble. The last block of IP addresses has been assigned by the Regional Internet Reg...

【综述】盘点卷积神经网络中的池化操作_小白学视觉的博客-程序员ITS203

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达池化操作(Pooling)是CNN中非常常见的一种操作,池化操作通常也叫做子采样(Subsampling)或降采样(Downsampling),在构建卷积神经网络时,往往会用在卷积层之后,通过池化来降低卷积层输出的特征维度,有效减少网络参数的同时还可以防止过拟合现象。主要功能有以下几点:抑制噪声,降低信...

随便推点

入行10年后,我总结了这份FPGA学习路线_ONEFPGA的博客-程序员ITS203_fpga学习

这部分的学习,建议大家对照教材或者参考书进行,此外,我强烈建议大家配合着开发板进行学习,这就是下面要说的FPGA入门路线的第四点:动手实验。FPGA入门学习第四部分:动手实验学习硬件不摸板子,就像纸上谈兵。所以最好结合开发板和参考书的实验例程,从头到尾走几遍前面说的流程。现在市面上这类书也有很多,其实内容也比较类似,比较经典的实验有流水灯、按键、数码管、红绿灯、一些常见总线的通信、一些数据和信号处理的实验等等。我当年看的是特权同学的书,相信很多同学也看过。我当时没买他的开发板,我用的是学校的板

JavaScript中BOM的组成_天元居士的博客-程序员ITS203_js中bom的组成包括

浏览器对象模型(Browser Object Model)        BOM    1.Window(BOM的核心)分为:       1. history(历史记录对象[上一页,下一页])        2.document(DOM):            link            form                  

matlab2016a安装MinGW_weixin_30580943的博客-程序员ITS203

景:通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有选,就在Matlab里键入mex -setup,下面只要根据提示一步步设置就可以了。目的:在...

HTML5笔记_卷心菜yst的博客-程序员ITS203

超文本标记语言,描述网页的一种语言,不是编程语言,而是一种标记语言,H5是它最新版本HTML类似房子的水泥墙CSS类似房子的白粉墙壁与瓷地砖JS类似房子的门,提供功能...

尘埃系列的服务器怎么样,棕色尘埃台服和谐了吗?棕色尘埃各服务器有何区别..._weixin_39524703的博客-程序员ITS203

棕色尘埃是一款由知名韩国发行商NEOWIZ开发的二次元卡牌手游,游戏注重对战中战术战略安排,也因此PVP占据了游戏的很大一部分。游戏还内置了天梯和排位系统,玩家能够体会到和大型竞技游戏比如LOL、守望先锋一样痛苦却又刺激的爬天梯体验,喜欢与人斗其乐无穷的玩家不容错过。而在入坑前选择一个适合的服务器是关键,我们今天就来介绍一下棕色尘埃几个服务器有何区别。棕色尘埃台服和谐了吗?棕色尘埃各服务器有何区别...

推荐文章

热门文章

相关标签