我怎么知道我要访问的地址是进程内存的一部分?我的意思是,例如,如果我尝试在随机过程中这样做mov ax, [0x010],它将在0x10时崩溃。不是在进程的内存中,与使用寄存器的间接内存访问相同。
那么,在访问地址之前,是否有一种方法可以通过进程自己的代码来验证地址是可读/可写的?
除了通过访问页面并捕捉操作系统发送给您的访问无效页面的信号或异常之外,没有办法发现页面是否可访问。
这是因为操作系统的分页机制捕获页面错误,然后确定该页是否应该有内存。如果是,则分配内存并配置页表以指向该内存。然后它重新启动您的程序,该程序访问新分配的页面,就好像它一直在那里一样。由于硬件不知道这是操作系统计划做的事情,因此它无法告诉您页面是否有效,即使它有办法这样做。
考虑查看特定于操作系统的机制来枚举进程的内存映射。例如,在Linux上,您可以检查进程文件系统以获得内存映射。有了这个内存映射,您就可以检测进程是否分配了哪些地址范围。