一、实验主要内容
1,整理源文件:
现在我们由于我们昨天工作,我们的源文件已经很多了,这里进行一些整理
整理的情况如下:
由于我们修改了很多.c文件,我们需要修改Makefile文件,修改指令如下:
2,内存容量检查(1)
我们要进行内存管理的第一步便是要确定内存有多大,这里我们通过自己编写程序去检查内存,而不是通过BIOS。
因为虽然在最初启动时,BIOS会检查内存容量,我们只需要询问BIOS就可以知道内存容量有多大。但这样的做法,会使asmhead.nas变长,另一方面,因为BIOS的版本不同,BIOS函数的调用方法也不相同,会导致很多的麻烦。
我们检查内存的方法:
首先先让486以后的CPU的高速缓存功能无效,然后向一个地址写入数据再读出来,如果该内存地址有效,就能正确读出数据,如果无效就会出现乱码,但如果在CPU里加上了缓存,那么写入和读出的便不是内存,而是缓存,最后便会导致所有的内存检查都是正常的,那么检查处理便不能完成。因此,只有在内存检查时将缓存设为OFF,这样才能进行正常的内存检查。
而 如何判断缓存是否要关闭,就需要先检查CPU是不是在486以上,如果是的话,那么就将缓存关闭。
创建memtest函数来实现(在b文件夹中的bootpack文件):
首先判断CPU是否是486以上还是386的,如果是486以上的话,那么EFLAGS寄存器的第18位就是所谓的AC标志位,如果CPU是386的,那么就没有这个标志位,第18位会是一直保持为0。现将1写入到第18位,然后再读出EFLAGS的值,继而检查AC标志位是否仍未1,最后,将AC标志位重置为0。
将AC标志位重置为0时,将eflag与上EFLAGS_AC_BIT即可。是取反运算符,将所有的位都反转,~EFLAGS_AC_BIT与0xfffbffff一样。
使用汇编语言编写函数load_cr0和store_cr0,对CR0寄存器的某一标志位进行操作来禁止缓存。
Load_cr0和store_cr0函数如下(在b文件夹中的naskfunc文件):
Memtest_sub函数:内存检查处理的实现部分(在b文件夹中的bootpack文件)
调查从起始地址到结束地址的范围,即能够使用的内存的末尾地址。如果p不是指针的话,就不能通过制定地址去读取内存,因此先执行p=i,然后用这个p,先将原来的值保存下来。接着试写