c - 在内存中查找进程页面(linux-kernel)

标签 c memory linux-kernel operating-system

基本上我有一个程序可以找到进程的所有 VMA,但我也想查看该进程的页表中的页。我很难过。我知道进程的 task_struct 有一个字段

pgd_t                  *pgd;                /* page global directory */

那只是所有页面的索引数组吗?

我在“/mm/memory.c”中找到了这个函数

/*
* Do a quick page-table lookup for a single page.
*/
struct page *follow_page(struct vm_area_struct *vma, unsigned long address,
                    unsigned int flags)

我可以将 VMA 传递给它,但我不确定地址和标志应该是什么。或许这不是我想要的?有什么建议吗?

最佳答案

听起来您想进行基本的页面浏览。

给定一个 pgd,您可以遍历条目以查找有效的 pud,然后遍历 pud,依此类推上。

一种方法是使用以下方法:

// iterate through your address space
for (i = 0; i < PAGE_SIZE / sizeof(*pud); i++) {
    pud = pud_offset(pgd, PUD_SIZE * i);
    // Check if the pud is valid
    if (pud_none(*pud) || pud_bad(*pud))
        continue;
    // And so on
}

关于c - 在内存中查找进程页面(linux-kernel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025183/

相关文章:

对创建二进制 sysfs 条目感到困惑

c - 是否可以在 C 中找到变量的数据类型?

c - 如何动态居中对齐 char * 字符串中的文本以适应 C 中总共 16 个空格?

linux - 从内核日志中的警告中识别代码

iphone - 这就是 Objective-C 中垃圾收集的全部内容吗?

c++ - 使用 valgrind 进行堆分配

assembly - 我可以在 gdb 下打印 gdtr 和 gdt 描述符吗?

代码不输出整个字符串,而是只输出其中的一部分

c - 如何在 Linux 设备上安装 clang?

c - 管道与 printf 命令