我因致电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_sem
和vma->vm_mm->page_table_lock
被锁定并且在内核上下文中的kthread
上运行。
答案 0 :(得分:0)
我想我解决了。我的代码中的主要问题是我将从kmap
返回的指针传递给kunmap
。我本应该传入页面指针。
另一项更改是使用pte_offset_kernel
代替pte_offset_map
。