检查虚拟内存地址的有效性

时间:2012-06-21 09:01:47

标签: linux linux-kernel linux-device-driver kernel

我正在迭代VMALLOC_START和VMALLOC_END之间的页面,我想要 检查我每次获得的地址是否有效。 我该如何管理?

我遍历这样的页面:

unsigned long *p;

    for(p = (unsigned long *) VMALLOC_START; p <= (unsigned long *) (VMALLOC_END - PAGE_SIZE); p += PAGE_SIZE)
    {
            //How to check if p is OK to access it?     

    }

谢谢!

1 个答案:

答案 0 :(得分:2)

最简单的方法是尝试更新它,并捕获异常。

通过使用内联汇编在__ex_table部分中定义条目来捕获异常 异常表条目包含指向内存访问指令的指针和指向恢复地址的指针。如果此指令发生了段错误,则EIP将设置为恢复地址。

像这样(我没有测试过,我可能会遗漏一些东西):

void *ptr=whatever;
int ok=1;
asm(
    "1: mov (%1),%1\n"    // Try to access
    "jmp 3f\n"            // Success - skip error handling
    "2: mov $0,%0\n"      // Error - set ok=0
    "3:\n"                // Jump here on success
    "\n.section __ex_table,\"a\""
    ".long 1b,2b\n"       // Use .quad for 64bit.
    ".prev\n"
    :"=r"(ok) : "r"(ptr)
);