仅使用(32位)x86汇编,是否可以检查地址是否可写,没有与操作系统交互,并且没有发生段错误的风险?
程序将在第3环的Linux系统上运行。我不能使用“verw”指令。
举一个例子,我可能想检查地址0x0804a000是否可写。但如果我,例如执行“mov eax,0x0804a000; mov [eax],eax”然后,如果地址不可写,程序将会段错误。我知道的另一种方法是将sys_read调用到该地址并查看它是否失败,但这与操作系统交互。
在给定约束的情况下,有没有办法检查地址是否可写?如果是这样,怎么样?
答案 0 :(得分:1)
如果您拥有内核权限,则可以在MMU中找到该信息。
但如果你不这样做,你根本就无法访问它,必须使用操作系统。
如果您的意思是不调用操作系统功能,那么至少在Windows上可以使用结构化异常处理。当然,它仍然是特定于操作系统的,因为您需要访问FS段的Windows TIB。