__pa()和__va()的作用

ArrayTang 2010-02-22 09:53:18
在看kernel时,被一个问题困扰: kernel虚拟地址空间已经通过页表映射了物理内存,所以kernel执行时对内存的访问都通过这个页表转换成对物理内存的访问, __pa()也是把虚拟地址转换成物理地址,这两者有什么区别呢?
...全文
2210 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
我本少年 2010-03-10
  • 打赏
  • 举报
回复 1
区别就是:
映射表是硬件mmu用来转换成物理地址的,而__pa(),则是代码中用来返回物理地址的,mmu的地址转换过程基本对代码是透明的
hallowwar 2010-02-23
  • 打赏
  • 举报
回复
内核映射表是必须的,我上学时学过。
谭海燕 2010-02-23
  • 打赏
  • 举报
回复
引用 3 楼 lihualoveyou 的回复:
再增加一句,用户空间的内存地址是通过映射表映射的。内核空间似乎这就是映射方式吧??


对。内核就是这个。

用户空间的映射方式比这复杂的多,反正我没看懂。





对于内核那一块,我是决定放弃看内存管理你不分代码的,真的不是一般的难····
KimenWu 2010-02-23
  • 打赏
  • 举报
回复
再增加一句,用户空间的内存地址是通过映射表映射的。内核空间似乎这就是映射方式吧??
KimenWu 2010-02-23
  • 打赏
  • 举报
回复
楼上基本说清。
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
用于将内核的虚拟地址转化成物理地址,内核地址的范围是3G-4G。

其中PAGE_OFFSET是内核选项中指定的
config PAGE_OFFSET
hex
default "0x80000000" if MMU
default "0x00000000"


看到内存管理的东东就头痛。高手继续解释………………

谭海燕 2010-02-23
  • 打赏
  • 举报
回复
这个你的问问lihualoveyou兄。

ArrayTang 2010-02-23
  • 打赏
  • 举报
回复
我觉得内核中的逻辑地址也需要经过段表和页表转换成物理地址. 2.4中kernel code的基址是0, 所以逻辑地址就是从3G开始,并且一一对应到物理地址从0开始。__pa()和__va()就是做这种转换的. 而2.0中kernel code的基址是3G, 逻辑地址就是从0开始,一一对应到物理地址从0开始,因此不需要__pa()和__va()的转换,是这样的理解的吗?
谭海燕 2010-02-22
  • 打赏
  • 举报
回复


如果物理内存小于950MB,则对于内核空间而言,给定一个虚地址x,其物理地址为“x- PAGE_OFFSET”,


给定一个物理地址x,其虚地址为“x+ PAGE_OFFSET”。

__pa()宏就是把虚拟地址转换成物理地址。

4,463

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧