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

freedomchen 2006-02-16 02:02:13
如题
...全文
504 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
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宏

4,465

社区成员

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

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