Linux操作系统内存管理的源码实现
发布时间:2016-05-30 15:46:33 所属栏目:Linux 来源:网络整理
导读:最近一段时间在阅读Linux的源代码,想把看到的东西写出来,觉得内存这一部分最简单,就先写了出 来。请指正! 内存最低4K的地址是一张页目录(page_dir),页目录
可以看到,数组项数是除去最低1M内存后可以分成的页面数,也就是可以用的物理内存页面。系统在 初始化的时候把还没有被使用的内存物理页面对应的项置为了0,初始代码如下: 399 void mem_init(long start_mem, long end_mem) 400 { 401 int i; 402 403 HIGH_MEMORY = end_mem; 404 for (i=0 ; i405 mem_map[i] = USED; 406 i = MAP_NR(start_mem); 407 end_mem -= start_mem; 408 end_mem >>= 12; 409 while (end_mem-->0) 410 mem_map[i++]=0; 411 } 其实前面所有的申请内存的程序里都最终使用了一个函数get_free_page(),不管申请多少的内存,最 终还是要按页面来申请: 63 unsigned long get_free_page(void) 64 { 65 register unsigned long __res asm("ax"); 66 67 __asm__("std ; repne ; scasbnt" 68 "jne 1fnt" 69 "movb ,1(%%edi)nt" 70 "sall ,%%ecxnt" 71 "addl %2,%%ecxnt" 72 "movl %%ecx,%%edxnt" 73 "movl 24,%%ecxnt" 74 "leal 4092(%%edx),%%edint" 75 "rep ; stoslnt" 76 "movl %%edx,%%eaxn" 77 "1:" 78 :"=a" (__res) 79 :"" (0),"i" (LOW_MEM),"c" (PAGING_PAGES), 80 "D" (mem_map+PAGING_PAGES-1) 81 :"di","cx","dx"); 82 return __res; 83 } (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |