为了理解内存管理,我实现了一个新的页表。我向内核插入一个模块(这个模块根据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。有谁可以帮助我?