从内核中读取用户空间页面的内容

时间:2015-03-18 14:56:30

标签: linux-kernel kernel virtual-memory

我因致电kmap而遭遇崩溃,而且我不知道原因。我希望有更多内核知识的人比我能帮助你。这是代码:

    pgd_t *pgd = pgd_offset(vma->vm_mm, userspace_addr);
    pud_t *pud = pud_offset(pgd, userspace_addr);
    pmd_t *pmd = pmd_offset(pud, userspace_addr);
    pte_t *pte = pte_offset_map(pmd, userspace_addr);

    if (pte_present_user(*pte)) {
            void *p = NULL;
            struct page *page = pte_page(*pte);

            get_page(page);
            p = kmap(page); /* CRASH HERE??? */

            /* Read from 'p' */

            kunmap(p);
            put_page(page);
    }

我已经隔离了对kmap的调用是罪魁祸首,因为没有它,代码运行正常。据我所知,所有指针都是有效的。

我不确定pte_offset_map是否应与kmap一起使用...

上面的代码在mm->mmap_semvma->vm_mm->page_table_lock被锁定并且在内核上下文中的kthread上运行。

1 个答案:

答案 0 :(得分:0)

我想我解决了。我的代码中的主要问题是我将从kmap返回的指针传递给kunmap。我本应该传入页面指针。

另一项更改是使用pte_offset_kernel代替pte_offset_map