8

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

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

我想里面应该有类似data指针的东西struct sk_buff,但我没有找到。


编辑

感谢 Mat 和 llya 的回答。

看了答案后,我认为第一个问题是确定 是否struct page位于ZONE_NORMALZONE_HIGHMEM

在文件 I/O 期间,当我们没有找到缓存页面时,我们将首先使用page_cache_alloc_cold(). page_cache_alloc_cold()最终会调用alloc_pages()它看起来会使用ZONE_HIGHMEM(在 x86 中,是从PAGE_OFFSET+896M 开始的内核内存区域)来完成它的工作。

所以

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

请纠正。

4

1 回答 1

3

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

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

HighMemory这个技巧是必需的,因为Linux中有一个概念(例如,请参阅链接)。

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

于 2012-04-04T12:37:43.797 回答