【发布时间】:2012-04-17 22:50:20
【问题描述】:
假设我们从页面缓存文件的地址空间中获得了struct page。
我们如何从struct page 中获取 4KB 数据的起始物理地址?
我想struct sk_buff里面应该有类似data指针的东西,但是我没找到。
编辑
感谢 Mat 和 llya 的回答。
看了答案后,我认为第一个问题是识别struct page是位于ZONE_NORMAL还是ZONE_HIGHMEM。
在文件 I/O 期间,当我们没有找到缓存页面时,我们将首先使用page_cache_alloc_cold() 分配一个新页面。 page_cache_alloc_cold() 最终将调用alloc_pages(),看起来它将使用ZONE_HIGHMEM(在x86 中,是从PAGE_OFFSET+896M 开始的内核内存区域)来完成它的工作。
所以
- 我认为Mat的回答适合
ZONE_NORMAL中的页面 - 假设我们使用
kmap()来查找与struct page关联的4KB数据的起始物理地址,那么我们应该使用(unsigned long)(&page)-PAGE_OFFSET来查找存储结构本身的物理地址是否正确?
请更正。
【问题讨论】:
-
将
page视为mem_map数组中的一项。
标签: c linux memory-management linux-kernel