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

标签 c linux memory-management linux-kernel

假设我们从页面缓存文件的地址空间中获得了一个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) 的工作。

所以

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

请更正。

最佳答案

您需要将一个页面映射到内核内存中,如下所示:

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

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

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

关于c - 如何从结构页中获取关联数据的物理地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10007571/

相关文章:

mysql - sphinx 在 group by 中有两个参数

c++ - 这个 std::vector 和 std::shared_ptr 内存泄漏是一个错误吗?

c - 如何使 wait_event_timeout 函数的 timeout = 1 秒?

c - "the start of an allocated memory block"在这里意味着什么?

c - 用 0-100 之间的数字填充数组

c - 3D ASCII 正弦波发生器产生奇怪的正弦波

python - 如何从同样动态创建 salt 状态的循环中要求动态创建的 salt 状态?

linux - 使用 Perl 发送休息请求

c# - 在 C# .NET 中清理 ODBC DSN

c++ - 这个重新分配是否正确?