社区
Linux_Kernel
帖子详情
__pa()和__va()的作用
ArrayTang
2010-02-22 09:53:18
在看kernel时,被一个问题困扰: kernel虚拟地址空间已经通过页表映射了物理内存,所以kernel执行时对内存的访问都通过这个页表转换成对物理内存的访问, __pa()也是把虚拟地址转换成物理地址,这两者有什么区别呢?
...全文
2210
8
打赏
收藏
__pa()和__va()的作用
在看kernel时,被一个问题困扰: kernel虚拟地址空间已经通过页表映射了物理内存,所以kernel执行时对内存的访问都通过这个页表转换成对物理内存的访问, __pa()也是把虚拟地址转换成物理地址,这两者有什么区别呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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()宏就是把虚拟地址转换成物理地址。
PA
VA
-JA
VA
-
pa
ge.zip_Protection
JA
VA
密码保护页面 JA
VA
pa
ssword protection
pa
ge
va
_list,
va
_start,
va
_arg,
va
_end使用说明
va
_start宏,获取可变参数列表的第一个参数的地址(list是类型为
va
_list的指针,
pa
ram1是可变参数最左边的参数): #define
va
_start(list,
pa
ram1) ( list = (
va
_list)&
pa
ram1+ sizeof(
pa
...
linux mmu源码分析,Linux kernel 2.6.29 - head.S 分析
VA
PA
, MMU 映射分析
重点解释MMU,
VA
,
PA
地址分配AB: 32 bit ARM 可寻址范围为:4GB (2^32)因此:
VA
虚拟地址空间为:4GB,将这4GB分成4K * 1M,这样共有4096个1M虚拟地址空间,记为:
VA
_seg_addr(其低20比特都为0)同样:对
PA
物理地址...
optee中的arm64的virt_to_phys的实现
/*virt transform to phys... arm_
va
2
pa
_helper((void *)buf_in, &phy_in); arm_
va
2
pa
_helper((void *)buf_out, &phy_out); #include <linux/module.h> #define BIT32(nr) ((1 & 0xffffffff) <
arm64内核地址空间(arm64架构linux内核地址转换__
pa
(x)与__
va
(x)分析) (4.x内核)
PA
GES=y CONFIG_ARM64_
VA
_BITS_48=y CONFIG_ARM64_
VA
_BITS=48 CONFIG_ARM64_
PA
_BITS_48=y CONFIG_ARM64_
PA
_BITS=48 代码中用的是
VA
_BITS 宏来体现虚拟空间的大小. #define
VA
_BITS (CONFIG_ARM64_
VA
_BITS) TTBR0_...
Linux_Kernel
4,463
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章