Linux操作系统内存管理的源码实现
发布时间:2016-02-08 06:20:48 所属栏目: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 }
(编辑:应用网_镇江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

