如何从结构页面获取关联数据的物理地址?

时间:2012-04-04 08:35:36

标签: c linux memory-management linux-kernel

假设我们从页面缓存文件的地址空间中获得了struct page

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

我想在data内应该有类似struct sk_buff指针的东西,但是我找不到它。


修改

感谢Mat和llya的答案。

在查看答案后,我认为第一个问题是确定struct pageZONE_NORMAL还是ZONE_HIGHMEM

在文件I / O期间,当我们找不到缓存页面时,我们将首先使用page_cache_alloc_cold()分配新页面。 page_cache_alloc_cold()将最终调用alloc_pages(),看起来它将使用ZONE_HIGHMEM(在x86中,是从PAGE_OFFSET + 896M开始的内核内存区域)来执行其作业。 / p>

所以

  • 我认为Mat的答案适用于ZONE_NORMAL
  • 中的页面
  • 假设我们使用kmap()来查找与struct页面关联的4KB数据的起始物理地址,我们应该使用(unsigned long)(&page)-PAGE_OFFSET来查找存储结构本身的物理地址是否正确?

请更正。

1 个答案:

答案 0 :(得分:1)

您需要将page映射到内核内存中,如下所示:

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

这个技巧是必需的,因为Linux中有HighMemory概念(参见前面的this链接。)。

UPD:您可以在非原子上下文中使用kmap代替kmap_atomic