加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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 }

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读