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
- 假设我们使用
查找与结构页关联的4KB数据的起始物理地址,我们应该使用kmap()
查找存储结构本身的物理地址是否正确(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
数组中的一项。