3.3.5 内存的检测
好啦,回到main函数继续我们的旅程,147行detect_memory(),用于探测物理内存的布局。注意哈,这里是第一次出现与内存管理相关的代码。
122int detect_memory(void) 123{ 124 int err = -1; 125 126 if (detect_memory_e820() > 0) 127 err = 0; 128 129 if (!detect_memory_e801()) 130 err = 0; 131 132 if (!detect_memory_88()) 133 err = 0; 134 135 return err; 136} |
detect_memory()函数主要根据物理内存的类型探测内存布局,代码非常简单,由上面可知,linux内核会分别尝试调用detect_memory_e820()、detcct_memory_e801()、detect_memory_88()获得系统物理内存布局,这3个函数内部其实都会以内联汇编的形式调用bios中断以取得内存信息。前面已经看到了该中断调用形式为int 0x15,同时调用前分别把AX寄存器设置为0xe820h、0xe801h、0x88h,关于0x15号中断的具体作用我这里就不再说明,有兴趣的可以去查询相关手册。下面我仅分析下detect_memory_e820()的代码,因为它是当今x86体系的一般情况,其它代码也基本一样:
20static int detect_memory_e820(void) 21{ |