【问题标题】:LInux Kernel API to find the vma corresponds to a virtual addressLInux Kernel API 查找vma对应的虚拟地址
【发布时间】:2012-09-05 11:41:03
【问题描述】:

有没有Kernel API可以找到VMA对应的​​虚拟地址?

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

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

【问题讨论】:

    标签: linux memory-management linux-kernel


    【解决方案1】:

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

    /* 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;
    

    【讨论】:

    • @Dhyan 您的编辑是正确的,函数定义在 v2.0.19 中发生了更改。其他人拒绝了它,但我自己更正了。
    【解决方案2】:

    从 v5.14-rc1 开始,linux/mm.h 中有一个名为 vma_lookup() 的新 API

    代码现在可以简化为:

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

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2021-07-25
      • 2011-01-11
      • 1970-01-01
      • 2015-06-18
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      相关资源
      最近更新 更多