2

我正在遍历 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?     

    }

谢谢!

4

1 回答 1

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)
);
于 2012-06-21T10:46:18.180 回答