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

C 如何从结构页获取关联数据的物理地址?,c,linux,memory-management,linux-kernel,C,Linux,Memory Management,Linux Kernel,假设我们从页面缓存文件的地址空间获得了一个struct page 我们如何从这个结构页面获取4KB数据的起始物理地址 我想在struct sk_buff中应该有类似data的指针,但我没有找到它 编辑 谢谢Mat和llya的回答 在查看了答案之后,我认为第一个问题是确定结构页面是否位于ZONE\u NORMAL或ZONE\u HIGHMEM中 在文件I/O期间,如果找不到缓存的页面,我们将首先使用page\u cache\u alloc\u cold()分配一个新页面page\u cache\

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

我们如何从这个
结构页面
获取4KB数据的起始物理地址

我想在
struct sk_buff
中应该有类似
data
的指针,但我没有找到它


编辑

谢谢Mat和llya的回答

在查看了答案之后,我认为第一个问题是确定
结构页面
是否位于
ZONE\u NORMAL
ZONE\u HIGHMEM

在文件I/O期间,如果找不到缓存的页面,我们将首先使用
page\u cache\u alloc\u cold()
分配一个新页面
page\u cache\u alloc\u cold()
最终将调用
alloc\u pages()
,看起来它将使用
ZONE\u HIGHMEM
(在x86中,它是从
page\u OFFSET
+896M开始的内核内存区域)执行其任务

所以

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

请更正。

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

void * mapping = kmap_atomic(page, KM_USER0);
// work with mapping...
kunmap_atomic(mapping, KM_USER0);
这个技巧是必需的,因为Linux中有一个
高内存
的概念(参见链接获取示例)


UPD:您可以在非原子上下文中使用
kmap
而不是
kmap\u-atomic

OP说他已经有了一个
struct页面
,为什么他需要精确地映射它?(顺便说一句:kmap_atomic的第二个论点在2009年afaict的某个时候消失了)好吧,在处理高内存时有一些限制。通用32位内核只能看到1G内存(0xc000000之后)。因此,假设您有超过4G的RAM。如何从内核访问它?将
page
视为
mem\u map
数组中的一项。