我正在遍历 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?
}
谢谢!
最佳答案
最简单的方法是尝试将其红色,并捕获异常。
通过使用内联汇编在 __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)
);
关于linux - 检查虚拟内存地址的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11134813/