页面结构的有效负载在哪里

时间:2013-10-04 20:17:36

标签: memory-management linux-kernel kernel

我正在研究Linux中的MM,当我找不到原始数据的存储位置时,我感到非常困惑。我以为它存储在page struct的某个字段中,但我找不到。

存储页面所代表的实际数据在哪里?以及如何获得指向它的指针?

3 个答案:

答案 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);
    }
}