如何从结构页面获取关联数据的物理地址?
比方说,我们从页面缓存文件的地址空间获得了struct page
。如何从结构页面获取关联数据的物理地址?
我们如何从这个struct page
获得4KB数据的起始物理地址?
我想应该是data
指针里面struct sk_buff
,但我没有找到它。
编辑
感谢垫子和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)用于其作业。
所以
- 我想垫的答案是适合页
ZONE_NORMAL
- 假设我们使用
kmap()
找到与结构页面相关联的4KB数据的起始物理地址,是正确的,我们应该使用(unsigned long)(&page)-PAGE_OFFSET
来查找存储结构本身的物理地址?
请更正。
你需要一个page
映射到内核内存如下:(见this链接EX)是有HighMemory
概念的Linux
void * mapping = kmap_atomic(page, KM_USER0);
// work with mapping...
kunmap_atomic(mapping, KM_USER0);
这个技巧是必需的。
UPD:您可以在非原子上下文中使用kmap
而不是kmap_atomic
。
OP说他已经有了一个'struct page',为什么他需要精确映射它? (顺便说一句:http://lwn.net/Articles/356378/; kmap_atomic的第二个参数在2009年有一段时间消失了) – Mat 2012-04-04 13:06:38
嗯,在处理HighMemory时有一些限制。通用32位内核只能看到1G的内存(在0xc000000之后)。所以想象你有更多的4G内存。你如何从内核访问它? – 2012-04-04 13:16:42
将'page'想象成mem_map'数组中的一个项目。 – 2012-04-04 18:23:07