禁用x86 32位中的分页

use*_*245 5 paging x86 assembly virtual-memory page-fault

我试图直接写入物理内存位置,所以我使用汇编函数首先禁用分页,写入值,然后重新启用分页,但由于某种原因,在尝试编写时仍会触发页面错误值.

据我所知,在x86-32bit中,通过在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
Run Code Online (Sandbox Code Playgroud)

这是实现我想做的正确方法吗?如果是这样,为什么还会在cr0中的位翻转时触发页面错误?

Mar*_*nau 3

当跳转指令(仅远跳转?)完成时,CR0 寄存器中的更改将被激活。

然而,禁用分页并不是一个好主意:您必须保证代码位于 1:1 映射内存中并且禁用中断。

如果使用堆栈,还必须确保堆栈是 1:1 映射的。

通过将ecx中的物理地址映射到虚拟地址,然后写入虚拟地址的方式来修改页表要容易得多。