我正在研究 Linux 中的 MM,当我找不到原始数据的存储位置时,我感到非常困惑。我以为它存储在页面结构的某个字段中,但我找不到那里。
页面所代表的实际数据存储在哪里?以及如何获得指向它的指针?
我正在研究 Linux 中的 MM,当我找不到原始数据的存储位置时,我感到非常困惑。我以为它存储在页面结构的某个字段中,但我找不到那里。
页面所代表的实际数据存储在哪里?以及如何获得指向它的指针?
page 结构只是一个存储元数据的助手。它实际上并不存储任何数据,而是在内存中定位数据的方向。也就是说,地址空间映射到物理地址等。实际数据仍然存储在物理内存中。
页面所代表的实际数据存储在哪里?
实际数据在物理页面地址中至少有一个虚拟地址和/或它在磁盘上的inode中并且从未被映射过。对于inode情况,访问虚拟地址将触发页面错误,并且该处理程序会将内存读入物理页面,并且错误代码将恢复。
以及如何获得指向它的指针?
我相信struct page
包含在另一个数组中,例如mem_map。例如,函数mem_map_next用于遍历struct page
. 也许您感兴趣的结构是struct vm_area_struct
?这是一个虚拟地址跟踪结构。可能有多个虚拟地址映射到同一个物理页面。
您需要知道组成结构的上下文才能知道 astruct page
表示的地址。然后它只是一个基地址加上索引乘以页面大小。
您可以使用 page_address() 来获取页面的虚拟地址。但是由于并非所有页面都映射了虚拟地址,因此返回地址可能为 NULL。
void *page_address(const struct page *page);
您可以使用 kmap 将 highmen 页面映射到虚拟地址。另外,当您不需要访问该页面时,请记住使用 kunmap 取消映射该页面。
struct page *page = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, 0);
if (page) {
void *addr = kmap(page);
if (addr) {
memset(addr, 0, PAGE_SIZE);
kunmap(addr);
}
}