[英]How to get the physical address of the associated data from a struct page?
假设我们从页面缓存文件的地址空间中获得了一个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 开始的 kernel memory 区域)。
所以
ZONE_NORMAL
中的页面kmap()
来查找与结构页关联的 4KB 数据的起始物理地址,我们应该使用(unsigned long)(&page)-PAGE_OFFSET
来查找存储结构本身的物理地址是否正确?请改正。
你需要把 map 一个page
变成 kernel memory 如下:
void * mapping = kmap_atomic(page, KM_USER0);
// work with mapping...
kunmap_atomic(mapping, KM_USER0);
这个技巧是必需的,因为 Linux 中有一个HighMemory
概念(例如,请参见此链接)。
UPD:您可以在非原子上下文中使用kmap
而不是kmap_atomic
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.