assembly - 在 x86 32 位中禁用分页

标签 assembly x86 paging virtual-memory page-fault

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

据我了解,在 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

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

最佳答案

当跳转指令(仅远跳转?)完成时,CR0 寄存器中的更改将变为事件状态。

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

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

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

关于assembly - 在 x86 32 位中禁用分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33841890/

相关文章:

sql - Advantage 数据库中的分页

c++ - 简单的 MIPS 指令和编译器

linux - 程序集不打印空行

assembly - 为什么使用 NASM 汇编时 `lea esi, dword [edx + ecx * 4]` 会产生错误?

gcc - 为什么 `mov %eax, %eax; nop` 比 `nop` 快?

caching - 根据以下数据计算平均内存访问时间?

sql - "Incorrect syntax near ' OFFSET '"修改sql comm 2012到2008

assembly - 如何使用emu8086读取硬件输入

assembly - 如何将拇指条件指令放入 IT block

assembly - 如何将负整数转换为字符串并在 MASM Assembly 中输出