2012-04-04 64 views
7

比方说,我们从页面缓存文件的地址空间获得了struct page如何从结构页面获取关联数据的物理地址?

我们如何从这个struct page获得4KB数据的起始物理地址?

我想应该是data指针里面struct sk_buff,但我没有找到它。


编辑

感谢垫子和llya的答案。

看完答案后,我认为第一个问题是确定struct page是否位于ZONE_NORMALZONE_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来查找存储结构本身的物理地址?

请更正。

+0

将'page'想象成mem_map'数组中的一个项目。 – 2012-04-04 18:23:07

回答

1

你需要一个page映射到内核内存如下:(见this链接EX)是有HighMemory概念的Linux

void * mapping = kmap_atomic(page, KM_USER0); 
// work with mapping... 
kunmap_atomic(mapping, KM_USER0); 

这个技巧是必需的。

UPD:您可以在非原子上下文中使用kmap而不是kmap_atomic

+1

OP说他已经有了一个'struct page',为什么他需要精确映射它? (顺便说一句:http://lwn.net/Articles/356378/; kmap_atomic的第二个参数在2009年有一段时间消失了) – Mat 2012-04-04 13:06:38

+0

嗯,在处理HighMemory时有一些限制。通用32位内核只能看到1G的内存(在0xc000000之后)。所以想象你有更多的4G内存。你如何从内核访问它? – 2012-04-04 13:16:42

相关问题