2

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

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

4

3 回答 3

3

page 结构只是一个存储元数据的助手。它实际上并不存储任何数据,而是在内存中定位数据的方向。也就是说,地址空间映射到物理地址等。实际数据仍然存储在物理内存中。

于 2013-10-04T20:50:07.587 回答
2

页面所代表的实际数据存储在哪里?

实际数据在物理页面地址中至少有一个虚拟地址和/或它在磁盘上的inode中并且从未被映射过。对于inode情况,访问虚拟地址将触发页面错误,并且该处理程序会将内存读入物理页面,并且错误代码将恢复。

以及如何获得指向它的指针?

我相信struct page包含在另一个数组中,例如mem_map。例如,函数mem_map_next用于遍历struct page. 也许您感兴趣的结构是struct vm_area_struct?这是一个虚拟地址跟踪结构。可能有多个虚拟地址映射到同一个物理页面

您需要知道组成结构的上下文才能知道 astruct page表示的地址。然后它只是一个基地址加上索引乘以页面大小。

于 2013-10-06T00:18:51.863 回答
1

您可以使用 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);
    }
}
于 2013-10-07T19:03:02.347 回答