我正在研究Linux中的MM,当我找不到原始数据的存储位置时,我感到非常困惑。我以为它存储在page struct的某个字段中,但我找不到。
存储页面所代表的实际数据在哪里?以及如何获得指向它的指针?
答案 0 :(得分:3)
page struct只是一个存储元数据的助手。它实际上并不存储任何数据,而是存储数据的方向。也就是说,地址空间映射到物理地址等。实际数据仍然存储在物理存储器中。
答案 1 :(得分:2)
存储页面所代表的实际数据在哪里?
实际数据位于物理页面地址中的至少一个虚拟地址 AND / OR 它位于 inode 的磁盘上从未被映射过。对于 inode 情况,访问虚拟地址将触发页面错误,该处理程序将内存读入物理页面并且出现故障代码将恢复。
如何获得指向它的指针?
我相信struct page
包含在另一个数组中,例如mem_map。例如,函数mem_map_next用于遍历struct page
数组。也许您感兴趣的结构是struct vm_area_struct
?这是虚拟地址跟踪结构。可能有多个虚拟地址映射到同一物理页面。
您需要知道组合结构的上下文,以了解struct page
所代表的地址。然后它只是一个基地址加上索引乘以页面大小。
答案 2 :(得分:1)
您可以使用page_address()来获取页面的虚拟地址。 但是由于并非所有页面都映射了虚拟地址,因此返回地址可能为NULL。
void *page_address(const struct page *page);
您可以使用kmap将高级页面映射到虚拟地址。 此外,请记住,当您不需要访问此页面时,请使用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);
}
}