我正在迭代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?
}
谢谢!
答案 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)
);