我尝试直接写入物理内存位置,因此我使用汇编函数首先禁用分页,写入值,然后重新启用分页,但不知何故,在尝试写入该值时仍会引发页面错误。
据我了解,在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中的位时仍然会触发页面错误?
/dev/mem
或Device\PhysicalMemory
)或内核提供的函数。顺便说一下,看起来(我不习惯AT&T语法),你在代码中倒置了值和地址。 - NeitsaEIP
是物理地址,会导致其他指令运行。您是否在bochs
中单步执行此操作以查看发生故障时确切发生了什么? - Peter Cordes