【发布时间】: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
有没有Kernel API可以找到VMA对应的虚拟地址?
示例:如果地址为 0x13000,我需要如下所示的一些函数
struct vm_area_struct *vma = vma_corresponds_to (0x13000,task);
【问题讨论】:
标签: linux memory-management linux-kernel
您正在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;
【讨论】:
从 v5.14-rc1 开始,linux/mm.h 中有一个名为 vma_lookup() 的新 API
代码现在可以简化为:
struct vm_area_struct *vma = vma_lookup(task->mm, 0x13000);
if (!vma)
return -EFAULT;
【讨论】: