2009-08-11 01:47于百度空间博客发表,今天移过来
linux内核源代码学习(1)内存映射模式
flyli 现在开始好好学习linux内核了,我觉得学习内核最好的方法莫过于是阅读源代码了,最近我就一直在读,不过说实话,因为本人不是计算机专业学生(我 是电子信息工程专业的)所以读原代码的难度还是有一些的,不过呢,我觉得功夫不负有心人,我啃也好啃完《linux内核源代码情景分析》这本书~ 刚开始读内核确实不知道从何读起,借助一本好的书我觉得还是很有必要的,在这里我买的是《linux内核源代码情景分析》,这本书,我觉得写的非常好,希望大家也买本来看看哈,网上也有pdf版本的,不过我还是觉得买本书比较好,而且要买正版的,毕竟人家高手写这么好的一本书给我们也不容易,增加点收入也是应该的嘛,嘎嘎。 好了,现在开始说正题,这本书其实我以前也大概翻过一点,想的“好读书不求甚解”,但是发现假如不完全读懂的话,读着独着后面就读不动了,于是开始重头认真看气。 今天下班终于把这本书关于内存映射这一部分完全读懂了读到了39页,不容易啊。。。。假如有兄弟在读这本书的话欢迎留言探讨哈~~~ 当然我不想抄书到博客上来,但是我想把书上的东西连贯起来,这样比较容易懂。 ![]() 以上是pentium pro之后的cpu的三层内存映射示意图,但是其中的PMD和PI层其实只有一层,linux中定义的是把PMD这一层给删掉了,为什么呢?因为在pgtable.h这个头文件中定义pmd这个表现只有一个,那么就相当于没有什么选择的余地了,也就是为了糊弄一下CPU的模式了,但是为什么不按照CPU硬件所支持的3层映射呢?原因就是虽然我们的程序有3G的虚拟空间,但是你见过多少程序占用的内存超过1G啊?何况是3G。。。这样就势必产生大量的空表项浪费内存空间,于是linux便去掉了中间层,通过两层映射,节约空间。 虚地址和线性映射地址其实是一致的都是从0开始的4G访问空间,但是对于系统来说,因为linux内核占用的虚拟内存空间其实是1G(不是真的占用,而是在虚拟地址中占用的哈),所以当虚地址转向物理地址是需要减去1G,反之则加上 其中段地址为20位,而页面表的大小是4k,所以我们可以算出CPU可以访问4G的线性空间 而每个目录项(GDT)占用的是32位的空间,而其PGD,PMD每个占用了10位的空间,那么只用到了20位,于是剩下的12位就用来挪作他用,用来什么标志位啊,还有一些其保护和校验作用的了 但是线性表(LDT)和目录项的关系还没有研究透,明天继续哈 今天就写这么多了,太晚了要不明天起不来上班了,明天继续看书,继续写哈 假如我的文章中有什么错误,希望大虾指正哈,小弟感激不尽! |