[第9天]内存管理

      今天作者先放下鼠标的问题,因为觉得会让读者感到无聊。确实。。今天作者初步讲了一下怎么测试内存容量以及测试的原理。

测试原理:

      往特定位置写入一个特定的数据如0xaa55aa55,进行反转,然后与0x55aa55aa比较是否相等。然后作者还说继续反转再与0xaa55aa55比较。我不是很清楚为什么要比较两次。。先照做。只要两次对比中有一次不一样就认为这个内存位置不是完整的,即到内存结尾了。

禁用缓存:

      cache的存在让上面的方法失效。因为CPU可以不访问内存直接在cache里操作。自然结果都是正确的,就无法判断内存大小。作者是先禁用了cache。原理有点蛋疼,主要是对CR0寄存器的某一标志位操作,需要设置第30位和29位为1,又因为x86小端记法,所以设置 #define CR0_CACHE_DISABLE 0x60000000 。代码见github

加速处理:

      作者原来的做法是每次检测4B。速度自然慢,可以0x1000位(4KB)一起检测,然后看最后一位就行,虽然会损失精度,但相对很小。代码如下:

 GCC优化:

      作者说他在编译后内存检测完全没有用,看汇编代码后发现判断被去掉了。原因是gcc自动优化了。还能不能好好玩耍了。还好我没有。但我使用-O1选项后也悲剧了。具体原因见书中解释。作者一怒就用了汇编。我不使用-O1没事就算了,直接用C。

内存管理:

      内存管理就是指内存的分配和释放。这是所有操作系统的基本职责。否则不知道内存用到哪了,不仅容量是个问题而且可能引起重叠。内存管理的方式大致有Single allocation,Partitioned allocation,Paged memory management,Segmented memory management。作者提供的内存管理我分不清是属于那一类。比较像Partitioned allocation。基本原理是从现有的空闲内存项中找到合适大小的分配。回收的时候看看能不能合并。不能合并的话新建表项。代码有点多。见github

注意事项:

      系统使用区域不能分配。我的系统内存与作者的有点不一样。然后后来被分配出去就死机了。所以要注意。今天没有分配内存,明天就有了。

mem

 

 

链接:

  1. Memory Management
  2. OSDev