gpt4 book ai didi

linux - 检查页面是否在任务的 VMA 中

转载 作者:太空狗 更新时间:2023-10-29 12:06:53 25 4
gpt4 key购买 nike

有没有办法检查指定进程是否使用了相关页面?即我有一个指向 struct pagestruct task_struct 的指针,我想获得一个 bool 值,表示该页面是否在进程的 VMA 中。目前我一直坚持在进程的 VMA 中获取页面的虚拟地址。如果我得到它,我将能够向下遍历 pgd 并查看它是否存在。

我已经尝试过在vma_address()(位于mm/rmap.c)中采用的方法,但是在遍历任务的mm_struct->mmap 列表中每个 vm_area_struct 的虚拟地址似乎都不同。这与使用作为争论。

那么,做这些事情的正确方法是什么?

最佳答案

事实证明,只有通过 PAGE_SIZE 来扫描整个 VMA 的唯一方法,如下所示:

struct page *page_by_address(const struct mm_struct *const mm,
const unsigned long address)
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
struct page *page = NULL;

pgd = pgd_offset(mm, address);
if (!pgd_present(*pgd))
goto do_return;

pud = pud_offset(pgd, address);
if (!pud_present(*pud))
goto do_return;

pmd = pmd_offset(pud, address);
if (!pmd_present(*pmd))
goto do_return;

pte = pte_offset_kernel(pmd, address);
if (!pte_present(*pte))
goto do_return;

page = pte_page(*pte);
do_return:
return page;
}

int contains_page(const struct mm_struct *const mm, struct page *const page)
{
int contains = 0;

if (mm != NULL) {
const struct vm_area_struct *vma = mm->mmap;
while (vma != NULL) {
unsigned long address;
for (address = vma->vm_start; !contains && address < vma->vm_end; address += PAGE_SIZE) {
contains = (page_by_address(mm, address) == page);
}

vma = vma->vm_next;
}
}

return contains;
}

关于linux - 检查页面是否在任务的 VMA 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8489178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com