加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux操作系统内存管理的源码实现

发布时间:2016-01-25 15:11:36 所属栏目:Linux 来源:网络整理
导读:最近一段时间在阅读Linux的源代码,想把看到的东西写出来,觉得内存这一部分最简单,就先写了出 来。请指正! 内存最低4K的地址是一张页目录(page_dir),页目录

如果这样了之,那也太不负责任了,只是在!current->executable || tmp >= current- >end_data的情况下,才这样做。这是怎样的情况呢?!current->executable有待阅读,tmp >= current->end_data很简单,在程序体已全部读入内存后,这可能是动态内存分配所要求的内存空间。 否则就尝试去和别的进程共享一下,如下:

378     if (share_page(tmp))
379         return;

如果共享不成,那也只好自己申请一张页面了,如下:

380     if (!(page = get_free_page()))
381         oom();

一张页面4K大小,那就到设备上去读4K大小的程序内容到内存,根据current->executable,可以 在设备上找到缺页对应程序的相应位置。

382 /* remember that 1 block is used for header */
383     block = 1 + tmp/BLOCK_SIZE;
384     for (i=0 ; i<4 ; block++,i++)
385         nr[i] = bmap(current->executable,block);
386     bread_page(page,current->executable->i_dev,nr);

判断读入4K是否大于程序长度,是的话,则把多出的部分清零。

387     i = tmp + 4096 - current->end_data;
388     tmp = page + 4096;
389     while (i-- > 0) {
390         tmp--;
391         *(char *)tmp = 0;
392     }

最后不能忘了把新页面的物理地址和出错的线性地址address相对应,形成映射。

393     if (put_page(page,address))
394         return;

do_no_page,就是操作系统理论中的请求调页。终于明白,原来那么多的操作系统书籍用那么大堆的 纸张所述的东西,真正写起操作系统来,用几小函数就把它们完成了。内存分配出去,当进程运行结束, 回收是必要的。其实这些也是简单的,因为有一个数组,就是下面的:

43 #define LOW_MEM 0x100000
44 #define PAGING_MEMORY (15*1024*1024)
45 #define PAGING_PAGES (PAGING_MEMORY>>12)
57 static unsigned char mem_map [ PAGING_PAGES ] = ;

(编辑:云计算网_泰州站长网)

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

热点阅读