假设我们从页面缓存文件的地址空间中获得了一个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()
来查找与结构页关联的4KB 数据的起始物理地址,我们应该使用(unsigned long)(&page) 是否正确- PAGE_OFFSET
找到存储结构本身的物理地址?
请更正。
最佳答案
您需要将一个页面
映射到内核内存中,如下所示:
void * mapping = kmap_atomic(page, KM_USER0);
// work with mapping...
kunmap_atomic(mapping, KM_USER0);
这个技巧是必需的,因为在 Linux 中有一个 HighMemory
概念(参见 this 示例链接)。
UPD:您可以在非原子上下文中使用 kmap
而不是 kmap_atomic
。
关于c - 如何从结构页中获取关联数据的物理地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10007571/