当前位置: 首页 > 面试题库 >

Linux中进程的步行页面表

丰佐
2023-03-14
问题内容

我正在尝试浏览Linux中某个进程的页表。在内核模块中,我实现了以下功能:

static struct page *walk_page_table(unsigned long addr)
{
    pgd_t *pgd;
    pte_t *ptep, pte;
    pud_t *pud;
    pmd_t *pmd;

    struct page *page = NULL;
    struct mm_struct *mm = current->mm;

    pgd = pgd_offset(mm, addr);
    if (pgd_none(*pgd) || pgd_bad(*pgd))
        goto out;
    printk(KERN_NOTICE "Valid pgd");

    pud = pud_offset(pgd, addr);
    if (pud_none(*pud) || pud_bad(*pud))
        goto out;
    printk(KERN_NOTICE "Valid pud");

    pmd = pmd_offset(pud, addr);
    if (pmd_none(*pmd) || pmd_bad(*pmd))
        goto out;
    printk(KERN_NOTICE "Valid pmd");

    ptep = pte_offset_map(pmd, addr);
    if (!ptep)
        goto out;
    pte = *ptep;

    page = pte_page(pte);
    if (page)
        printk(KERN_INFO "page frame struct is @ %p", page);

 out:
    return page;
}

此函数是从调用的ioctl,它addr是进程地址空间中的虚拟地址:

static int my_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long addr)
{
   struct page *page = walk_page_table(addr);
   ...
   return 0;
}

奇怪的是,ioctl在用户空间进程中调用时,此段错误…但是似乎我在寻找页表条目的方式是正确的,因为dmesg我可以通过每次ioctl调用获取例如:

[ 1721.437104] Valid pgd
[ 1721.437108] Valid pud
[ 1721.437108] Valid pmd
[ 1721.437110] page frame struct is @ c17d9b80

那么,为什么该过程无法正确完成“ ioctl”调用?也许我必须在浏览页面表之前锁定一些东西?

我正在使用内核2.6.35-22和三级页表。

谢谢你们!


问题答案:
pte_unmap(ptep);

标签刚好消失了。尝试以这种方式更改代码:

    ...
    page = pte_page(pte);
    if (page)
        printk(KERN_INFO "page frame struct is @ %p", page);

    pte_unmap(ptep);

out:


 类似资料:
  • 问题内容: 我从Linux 64位汇编程序访问进程命令行时遇到问题。为了用最少的代码重现该代码,我制作了一个32位程序,该程序打印程序名的前5个字符: 该程序正在运行。当我将其转换为64位并在Linux 64上运行时,它不会显示任何内容: 我的错误在哪里? 问题答案: 您正在将正确的地址加载到中。 然后调用32位syscall接口。这会将地址截断为32位,这使它不正确。(如果您使用调试器并在第一个

  • 本文向大家介绍Solaris中的进程同步,包括了Solaris中的进程同步的使用技巧和注意事项,需要的朋友参考一下 Solaris实现了各种锁来支持多任务,多线程和多处理。它使用自适应互斥锁,条件变量,信号量,读写锁,旋转栅门来控制对关键部分的访问。 一个自适应互斥使用用于保护仅由短代码段访问每一个关键数据项。 在多处理器系统上,它以标准信号量自旋锁开始。如果锁由正在另一个CPU上运行的线程持有,

  • 问题内容: 我试图运行一个异步进程,但我不希望程序等到这些进程执行结束。我发现了这个问题,如何从Java程序中异步运行shell脚本,但是它没有我想要的答案。 我正在做的只是运行bash进程,而在运行bash进程后,我不希望Java程序等到完成为止。这是我所做的: 我还在main方法的末尾放出了另一张印刷品,因此得到以下输出: 但是,程序不会终止,因为这两个进程尚未终止。 我该如何解决这个问题?

  • 我在剃刀页面中得到以下错误。 所以我改了。 现在代码将运行,但我得到警告。 下面是我完整的部分。

  • 问题内容: 如何同步运行Windows上的两个Java进程? 我正在寻找类似Win32 Named Mutex对象的对象,该对象允许两个进程使用相同的锁定对象。 谢谢 问题答案: 在Java中无法完成所需的操作。不同的Java应用程序将使用不同的JVM,将它们完全分隔成不同的“黑匣子”。但是,您有2个选择: 使用插座(或通道)。基本上,一个应用程序将打开侦听套接字并开始等待,直到它接收到一些信号为

  • Linux 系统启动过程 Linux 的启动其实和 Windows 的启动过程很类似,不过 Windows 我们是无法看到启动信息的,而 linux 启动时我们会看到许多启动信息,例如某个服务是否启动。 Linux 系统的启动过程大体上可分为五部分:内核的引导;运行 init;系统初始化;建立终端 ;用户登录系统。 内核引导 当计算机打开电源后,首先是 BIOS 开机自检,按照 BIOS 中设置的