我试图直接写入物理内存位置,因此我使用汇编函数首先禁用分页,写入值,然后重新启用分页,但由于某种原因,在尝试写入时仍然会触发页面错误价值。
据我了解,在x86-32位中,通过翻转cr0中的第32位来打开和关闭分页,所以这是我的汇编函数:
mov 4(%esp), %ecx //address
mov 8(%esp), %edx //value
mov %cr0, %eax
and $0x7fffffff, %eax
mov %eax, %cr0
mov %edx, (%ecx) //this line still triggers a page fault somehow
or $0x80000000, %eax
mov %eax, %cr0
ret
这是实现我想做的事情的正确方法吗?如果是这样,为什么 cr0 中的位翻转后仍然会触发页面错误?
当跳转指令(仅限远跳转?)完成时,CR0 寄存器中的更改将生效。
然而,禁用分页并不是一个好主意:您必须保证代码位于 1:1 映射内存中并且禁用中断。
如果使用堆栈,还必须确保堆栈是 1:1 映射的。
通过将ecx中的物理地址映射到虚拟地址,然后写入虚拟地址的方式来修改页表要容易得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)