+ -
当前位置:首页 → 问答吧 → 系统空间的线性地址是通过简单的线性映射到物理地址的?

系统空间的线性地址是通过简单的线性映射到物理地址的?

时间:2009-02-19

来源:互联网

从linux内核源代码情景分析的第二章看到这句话”
“系统空间占据了虚拟空间中的高1GB字节,在物理的内存中却总是从最低的地址(0)开始的。
所以,对于内核来说,其地址的映射是很简单的线性映射,0xc0000000就是两者之间的位移量。
也就是说,对于系统空间而言,给定一个虚地址x,其物理地址是从x中减去0xc0000000;
相应地,给定一个物理地址x,其虚地址是x+0xc0000000。“

不知道怎么理解?
难道说系统空间的线性地址不经过页表就直接线性映射到物理地址上吗?
而进程空间的线性地址得经过页表的转换才能映射到物理地址上的
这两者是不一样的?

作者: eclipse_2   发布时间: 2009-02-19



QUOTE:
原帖由 eclipse_2 于 2009-2-19 21:02 发表
从linux内核源代码情景分析的第二章看到这句话”
“系统空间占据了虚拟空间中的高1GB字节,在物理的内存中却总是从最低的地址(0)开始的。
所以,对于内核来说,其地址的映射是很简单的线性映射,0xc0000000就 ...



系统空间的线性地址在访问的时候同样是要经过页目录与页表的查找, 才能够映射到实际的物理地址上, 但是由于内核在建立页表的时候, 使系统空间的逻辑地址对应的页表中的值与实际的物理地址有一个PAGE_OFFSET的对应关系. 所以系统的线性地址即使在经过段页式变换之后, 得到的结果仍然是x-PAGE_OFFSET的值.

作者: scutan   发布时间: 2009-02-19

相应的页表设置在函数pagetable_init中完成的.

作者: scutan   发布时间: 2009-02-19



QUOTE:
原帖由 scutan 于 2009-2-19 21:09 发表


系统空间的线性地址在访问的时候同样是要经过页目录与页表的查找, 才能够映射到实际的物理地址上, 但是由于内核在建立页表的时候, 使系统空间的逻辑地址对应的页表中的值与实际的物理地址有一个PAGE_OFFSET ...



是这样啊
内核的每个页表项都对应上不同的物理地址
那进程在进程空间分配页面的时候不就没有空闲的页面 这个怎么理解啊?

作者: eclipse_2   发布时间: 2009-02-19



QUOTE:
原帖由 eclipse_2 于 2009-2-19 21:16 发表


是这样啊
内核的每个页表项都对应上不同的物理地址
那进程在进程空间分配页面的时候不就没有空闲的页面 这个怎么理解啊?



内核态的页表中的值与实际的物理地址只是一个对应的关系(PAGE_OFFSET), 并不表示那个页框就被内核使用了啊.

作者: scutan   发布时间: 2009-02-19



QUOTE:
原帖由 scutan 于 2009-2-19 21:24 发表


内核态的页表中的值与实际的物理地址只是一个对应的关系(PAGE_OFFSET), 并不表示那个页框就被内核使用了啊.




明白了 脑袋一时没转过来
我去看下pagetable_init函数
谢谢版主了

作者: eclipse_2   发布时间: 2009-02-19

不客气, ULK第2章和情景分析最后一章也对这个函数讲解了一下的.

作者: scutan   发布时间: 2009-02-19



QUOTE:
原帖由 scutan 于 2009-2-19 21:32 发表
不客气, ULK第2章和情景分析最后一章也对这个函数讲解了一下的.


恩 马上看
这两本书我只看了一两遍
看来只有等我看了几百遍之后才有机会达到版主的水平哦~

作者: eclipse_2   发布时间: 2009-02-19

呃, 其实我也没看几遍, 也只是在遇到不懂的时候去查.

作者: scutan   发布时间: 2009-02-19

都是要通过页表才能实现映射的;

“在物理的内存中却总是从最低的地址(0)开始的”这句话是不对的,是要针对具体处理器平台的,虽然大部分处理器平台的物理内存地址是可以被配置成从0开始的,但不是所有的都是,所以这句话是不确切的,当然我没看过这本书,也许这句话在上下文中是特指某个平台。

可以看看下周即将出版的《嵌入式系统Linux内核开发实战指南(ARM平台)》。

[ 本帖最后由 chinaemblinux 于 2009-2-19 22:02 编辑 ]

作者: chinaemblinux   发布时间: 2009-02-19