LInux Kernel API查找vma对应的虚拟地址

时间:2012-09-12 12:42:11

标签: linux memory-management linux-kernel

是否有任何内核API可以找到VMA对应的​​虚拟地址?

示例:如果a的地址为0x13000,我需要一些函数,如下所示

 struct vm_area_struct *vma =  vma_corresponds_to (0x13000,task);

2 个答案:

答案 0 :(得分:4)

您正在寻找find_vma中的linux/mm.h

/* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */
extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);

这应该可以解决问题:

struct vm_area_struct *vma = find_vma(task->mm, 0x13000);
if (vma == NULL)
    return -EFAULT;
if (0x13000 >= vma->vm_end)
    return -EFAULT;

答案 1 :(得分:1)

自 v5.14-rc1 起,linux/mm.h 中有一个名为 vma_lookup()

的新 API

现在可以将代码简化为以下内容:

struct vm_area_struct *vma = vma_lookup(task->mm, 0x13000);

if (!vma)
    return -EFAULT;