1 整理源文件(harib06a)
这里仅仅是对文件进行了一些整理,查看下图即可。
2 内存容量检查(1)(harib06b)
内存管理在操作系统中是一大块,既是重点也是难点,所以作者也花了较大的篇幅进行介绍。
要进行内存管理,首先要做的事情就是搞清楚内存究竟有多大,范围是到哪里。如果连这一点都搞不清楚的话,内存管理就无从谈起。
在最初启动时,BIOS肯定要检查内存容量,所以我们只要问一问BIOS,就能知道内存容量有多大,但问题是,如果那样做的话,一方面asmhead.nas会变长,另一方面,BIOS版本不同,BIOS函数的调用方法也不相同,麻烦事情比较多,所以自己去检查内存。
介绍一种做法。(这段内容是作者介绍高速缓冲存储器Cache,介绍它的目的是为了能够帮助我们理解为什么在检查内存之前需要关闭它,由于内容偏向于介绍性,所以直接截取原书中的内容)。 将AC标志位置0时,用到了AND运算,那里出现了一个运算符“~”,它是取反运算符。为了禁止缓存,需要对CR0寄存器的某一标志位进行操作,对哪里操作,怎么操作,都在程序中有了体现,需要用到函数load_cr0 和 store_cr0,这两个函数也只能用汇编来写(如下图所示)。
此外,memtest_sub函数,时内存检查处理的实现部分。 这个程序所做的是:调查从start地址到end地址的范围内,能够使用的内存的末尾位置。做的检查很简单。首先如果p不是指针,就不能指定地址去读取内存,所以要先执行 “p = i;” ,紧接着使用这个p,将原值保存到变量old中,接着试写 0xaa55aa55,在内存里反转该值,检查结果是否正确,如果正确,就再次反转它,检查一下能否能恢复到初始值。最后,使用old变量,将内存的值恢复回去。如果在某个环节没能恢复成预想的值,那么就在那个环节终止调查,并报告终止时的地址。
i的值每次增加4是因为每次要检查四个字节,之所以把变量命名为pat0、pat1是因为这些变量表示测试时所用的几种形式。
运行可以发现速度相当慢,对代码进行优化: 改变的内容只是for语句中 i 的增值部分以及p的赋值部分。每次只检查4,就要检查全部内存,速度太慢了,所以改成了每次增加0x1000,相当于4KB,这样一来速度提升了1000倍。p的赋值计算式也变了,这是因为,如果不进行任何改变仍写作p = i的话,程序就只会检查4KB最开头的4个字节,所以要改成p = i + 0xffc;,让它只检查末尾的4个字节。毕竟在系统启动时内存就已经被仔细检查过了,所以像这次这样,目的只是确认容量的话,做到如此程度就足够了,甚至可以每次检查1MB都没什么问题。
3 内存容量检查(2)(harib06c)
这一小节作者着重讲述了为什么会出现上面的那个情况(内存容量不对),由于讲解非常详细,这里也贴上原书的解释。 汇编程序这里需要仔细按照旁边的注释去理解。
4 挑战内存管理(harib06d)
这里牵涉到非常多的算法,难度一般,如果有OS基础的话理解起来还是不咋难的。
|