免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: frank_seng

Linux内存:内存管理的实质 [复制链接]

论坛徽章:
0
发表于 2008-05-20 12:53 |显示全部楼层
惭愧 有lz一半认真和毅力就好了
收藏

论坛徽章:
0
发表于 2008-05-20 13:29 |显示全部楼层
frank_seng真是超级牛人,linuxforum上这个id也是你吧,还有个stephenseng的博客不会也是你的吧?
最喜欢这种站在一定高度概括全局的文章,要看代码的话,直接上情景分析好了
那三个zone没提到?不会2.6去掉了吧

论坛徽章:
0
发表于 2008-05-20 14:45 |显示全部楼层
原帖由 hlidea 于 2008-5-20 13:29 发表
frank_seng真是超级牛人,linuxforum上这个id也是你吧,还有个stephenseng的博客不会也是你的吧?
最喜欢这种站在一定高度概括全局的文章,要看代码的话,直接上情景分析好了
那三个zone没提到?不会2.6去掉了吧

《情景分析》?有这么好吗,无数人奉为圣经。可能因为我比较反感源码注释的书。
个人认为除了ULK,其它讲内核的书都不如何。ULK就是概括性最好的书籍。
可惜的是,ULK站的高度太高,很难顾全很多地方,并且硬件部分讲的太少了。

论坛徽章:
0
发表于 2008-05-20 17:08 |显示全部楼层
确实不错  多谢楼主与大家分享

论坛徽章:
0
发表于 2008-05-20 20:08 |显示全部楼层
前辈们的学习精神,和求知的毅力,让后辈感触幽深呀!
   新来的LINUX成员,在前辈们问好了。。。

论坛徽章:
0
发表于 2008-05-20 21:36 |显示全部楼层
1. 内核初始化:

    * 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系;

这个len好象不是指的物理内存大小吧

论坛徽章:
0
发表于 2008-05-20 22:05 |显示全部楼层
"内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系."
用户空间的虚拟地址(0——3G)和物理内存的对应关系是怎样的?内核空间和用户空间的虚拟地址在物理内存中分别映射到什么空间?最近看MMU,有点不清楚,请指点。

论坛徽章:
0
发表于 2008-05-20 22:41 |显示全部楼层
原帖由 hlidea 于 2008-5-20 13:29 发表
frank_seng真是超级牛人,linuxforum上这个id也是你吧,还有个stephenseng的博客不会也是你的吧?
最喜欢这种站在一定高度概括全局的文章,要看代码的话,直接上情景分析好了
那三个zone没提到?不会2.6去掉了吧

hlidea兄猜的都是对的,火眼金星啊。另外zone还在,这里为了问题简单化把chap/zone/slab等统统忽略不提了。承蒙hlidea夸奖!

[ 本帖最后由 frank_seng 于 2008-5-20 22:48 编辑 ]

论坛徽章:
0
发表于 2008-05-20 22:44 |显示全部楼层
原帖由 W.Z.T 于 2008-5-20 21:36 发表
1. 内核初始化:

    * 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系;

这个len好象不是指的物理内存大小吧

该len为BIOS检测出的所有内存大小的总和,包括挂在总线上的RAM/ROM等等。BIOS检测后会以e820表项的形式存储起来,Linux内核启动后会读取这些e820表项的内容,得出系统中存在的RAM/ROM的分布及其总和,因此这里的物理内存不能仅仅理解成我们通常意义上的内存条RAM。

论坛徽章:
0
发表于 2008-05-20 22:46 |显示全部楼层
原帖由 jgq516 于 2008-5-20 22:05 发表
"内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系."
用户空间的虚拟地址(0——3G)和物理内存的对应关系是怎样的? ...

用户空间的虚拟地址是在使用时圈定的,并不是线性映射关系,请看上文中的5和6:
......
5. 用户进程申请内存vaddr = malloc(size):

    * 内存管理模块从用户进程内存空间(0--3G)中找到一块还没使用的空间vm_area_struct(start--end);
    * 随后将其插入到task->mm->mmap链表中;

6. 用户进程写入vaddr(0-3G),例如执行指令mov(eax, vaddr):

    * CPU获得vaddr这个虚地址,该虚地址应该已经由glibc库设置好了,一定在3G一下的某个区域,根据CR3寄存器指向的current->pgd查当前进程的页目录页表数据库,发现该vaddr对应的页目录表项为0,故产生异常;
    * 在异常处理中,发现该vaddr对应的vm_area_struct已经存在,为vaddr对应的页目录表项分配一个页表;
    * 随后从free_list找到一个page,将该page对应的物理页面物理首地址赋给vaddr对应的页表表项,很明显,此时的vaddr和paddr不是线性对应关系了;
    * 将page从free_list中脱离;
    * 异常处理返回;
    * CPU重新执行刚刚发生异常的指令mov(eax, vaddr);
    * CPU获得vaddr这个虚地址,根据CR3寄存器指向的current->pgd,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
    * 将eax的内容写入vaddr对应的物理内存地址内;  
......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP