duanius
发表于 2008-05-20 12:53
惭愧 有lz一半认真和毅力就好了
收藏
hlidea
发表于 2008-05-20 13:29
frank_seng真是超级牛人,linuxforum上这个id也是你吧,还有个stephenseng的博客不会也是你的吧?
最喜欢这种站在一定高度概括全局的文章,要看代码的话,直接上情景分析好了
那三个zone没提到?不会2.6去掉了吧
zx_wing
发表于 2008-05-20 14:45
原帖由 hlidea 于 2008-5-20 13:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
frank_seng真是超级牛人,linuxforum上这个id也是你吧,还有个stephenseng的博客不会也是你的吧?
最喜欢这种站在一定高度概括全局的文章,要看代码的话,直接上情景分析好了
那三个zone没提到?不会2.6去掉了吧
《情景分析》?有这么好吗,无数人奉为圣经。可能因为我比较反感源码注释的书。
个人认为除了ULK,其它讲内核的书都不如何。ULK就是概括性最好的书籍。
可惜的是,ULK站的高度太高,很难顾全很多地方,并且硬件部分讲的太少了。
kewenliang
发表于 2008-05-20 17:08
确实不错多谢楼主与大家分享
JoveLuo
发表于 2008-05-20 20:08
:lol: :lol: 前辈们的学习精神,和求知的毅力,让后辈感触幽深呀!
新来的LINUX成员,在前辈们问好了。。。:lol:
W.Z.T
发表于 2008-05-20 21:36
1. 内核初始化:
* 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了::这样的虚地址vaddr和物理地址paddr的线性对应关系;
这个len好象不是指的物理内存大小吧
jgq516
发表于 2008-05-20 22:05
"内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了::这样的虚地址vaddr和物理地址paddr的线性对应关系."
用户空间的虚拟地址(0——3G)和物理内存的对应关系是怎样的?内核空间和用户空间的虚拟地址在物理内存中分别映射到什么空间?最近看MMU,有点不清楚,请指点。
frank_seng
发表于 2008-05-20 22:41
原帖由 hlidea 于 2008-5-20 13:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
frank_seng真是超级牛人,linuxforum上这个id也是你吧,还有个stephenseng的博客不会也是你的吧?
最喜欢这种站在一定高度概括全局的文章,要看代码的话,直接上情景分析好了
那三个zone没提到?不会2.6去掉了吧
hlidea兄猜的都是对的,火眼金星啊。另外zone还在,这里为了问题简单化把chap/zone/slab等统统忽略不提了。承蒙hlidea夸奖!
[ 本帖最后由 frank_seng 于 2008-5-20 22:48 编辑 ]
frank_seng
发表于 2008-05-20 22:44
原帖由 W.Z.T 于 2008-5-20 21:36 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
1. 内核初始化:
* 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了::这样的虚地址vaddr和物理地址paddr的线性对应关系;
这个len好象不是指的物理内存大小吧
该len为BIOS检测出的所有内存大小的总和,包括挂在总线上的RAM/ROM等等。BIOS检测后会以e820表项的形式存储起来,Linux内核启动后会读取这些e820表项的内容,得出系统中存在的RAM/ROM的分布及其总和,因此这里的物理内存不能仅仅理解成我们通常意义上的内存条RAM。
frank_seng
发表于 2008-05-20 22:46
原帖由 jgq516 于 2008-5-20 22:05 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
"内核建立好内核页目录页表数据库,假设物理内存大小为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对应的物理内存地址内;
......
页:
1
[2]
3
4
5
6
7
8
9
10
11