设置cr3寄存器后,为什么机器会重启?

时间:2017-07-28 12:34:11

标签: linux memory-management linux-kernel kernel-module

为了理解内存管理,我实现了一个新的页表。我向内核插入一个模块(这个模块根据orignal页面表创建一个新的页面表),通过ioctl系统调用,我可以控制进程使用新的页面表,但是当内核模块执行mov %rdi,%cr3时,机器重启,我花了很多时间找到原因,但我无法解决问题。 也许有些事我理解错了。

我用qemu命令检查页面表的pte。因此,我确定虚拟地址 0xffffffffc04bca42 可以转换为物理地址。 但是当我使用gdb进行调试时,在vm执行 0xffffffffc04bca3f 后,vm重新启动。

当地址下一条指令可以正确翻译时,为什么机器重启?我该怎么做才能解决这个问题?

我对这个问题发疯了。

0xffffffffc04bca2d <ioctl_switchpgd+79>:   callq  0xffffffff810cb7a4 <printk>
0xffffffffc04bca32 <ioctl_switchpgd+84>:   movabs $0xffffffffffffff,%rdi
0xffffffffc04bca3c <ioctl_switchpgd+94>:   and    %rbx,%rdi
0xffffffffc04bca3f <ioctl_switchpgd+97>:   mov    %rdi,%cr3
**0xffffffffc04bca42 <ioctl_switchpgd+100>:  nopl   0x0(%rax)**
0xffffffffc04bca46 <ioctl_switchpgd+104>:  mov    $0xffffffffc04bd13a,%rdi

我将代码上传到github,https://github.com/peasentspring/replace_pgd.git。有谁可以帮助我?

0 个答案:

没有答案