如何通过一个物理页的page结构得到该物理页的地址?

freedomchen 2006-02-16 02:02:13
如题
...全文
215 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
guhuo2000 2006-03-31


page_address(struct page *); 返回的就是page->virtual 即内核虚拟地址

如果页是属于ZONE_NORMAL 或者 ZONE_DMA 返回的就是内核逻辑地址, 和物理地址差一个常熟
回复
从全局变量mem_map[]数组中搜索出该page的数据结构,那个下标就是物理页面的序号,所以在低位补上12个0之后就是物理页面的起始地址了。不知道是不是这样?

参考:<<LINUX源代码情景分析>>中第42页的一句话:内核中有个全局变量mem_map,整个数组就代表着全部物理页面。因此,页面表项的高20位对于软件和MMU硬件有着不同的意义。对于软件,这是一个物理页面的诒,将这个用作下标就可以从mem_map找到代表这个物理页面的page数据结构。对于硬件,则在低位补上12个0后就是物理页面的起始地址。
回复
tb01412 2006-02-17
如果我们拥有一个逻辑地址,可通过定义在 <asm/page.h> 中的宏 _ _pa() 返回与其关联的物理地址。我们也可以使用 _ _va() 宏将物理地址映射回逻辑地址,但只能用于低端内存页。

回复
xhs1115 2006-02-17
用page_address宏
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4156

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2006-02-16 02:02
社区公告
暂无公告