>>> 此贴的回复 >> 如果我们拥有一个逻辑地址,可通过定义在 中的宏 _ _pa() 返回与其关联的物理地址。我们也可以使用 _ _va() 宏将物理地址映射回逻辑地址,但只能用于低端内存页。
>>> 此贴的回复 >> 用page_address宏
>>> 此贴的回复 >> 从全局变量mem_map[]数组中搜索出该page的数据结构,那个下标就是物理页面的序号,所以在低位补上12个0之后就是物理页面的起始地址了。不知道是不是这样?
参考:中第42页的一句话:内核中有个全局变量mem_map,整个数组就代表着全部物理页面。因此,页面表项的高20位对于软件和MMU硬件有着不同的意义。对于软件,这是一个物理页面的诒,将这个用作下标就可以从mem_map找到代表这个物理页面的page数据结构。对于硬件,则在低位补上12个0后就是物理页面的起始地址。
>>> 此贴的回复 >> page_address(struct page *); 返回的就是page->virtual 即内核虚拟地址
如果页是属于ZONE_NORMAL 或者 ZONE_DMA 返回的就是内核逻辑地址, 和物理地址差一个常熟