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

我正在遍历VMALLOC_START和VMALLOC_END之间的页面,我想检查每次获取的地址是否有效。 我怎样才能pipe理这个?

我遍历这样的页面:

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? } 

谢谢!

最简单的方法就是尝试将其刷新,并捕获异常。

捕获异常是通过使用内联汇编在__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) );