linux-kernel - 使用 QEMU 和 GDB 调试 xv6 时无法访问内核空间

标签 linux-kernel gdb qemu riscv xv6

我正在自学2019版MIT 6.828/6.S081: Operating System Engineering .

我尝试使用 QEMU 将 GDB 附加到在 RISC-V 上运行的 xv6,以了解在用户模式和内核模式之间发生上下文切换时发生了什么。

做完之后 make qemu-gdbgdb在同一目录中,我的 GDB 成功连接到 QEMU。然而:

(gdb) x/2i $pc
=> 0xd8c:   ecall
   0xd90:   ret

问题是: 现在如果我 stepi ,它“跳过”到0xd90而不是进入内核空间。

此外,不允许访问任何内核地址,就好像我在调试一个普通的用户态程序一样:

(gdb) i r stvec
stvec          0x3ffffff000 274877902848
(gdb) x/i $stvec
   0x3ffffff000:    Cannot access memory at address 0x3ffffff000

环境:

主机虚拟机:Manjaro 19.0.2

sudo pacman -Syy

sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb qemu-arch-extra

GDB:9.1

QEMU:4.2.0

海湾合作委员会:9.2.0

非常感谢任何人都可以分享一些关于这里发生的事情的见解。非常感谢!

最佳答案

我想你的代码是在 ubuntu 上运行的,这是我遇到的问题,然后我换到 mac,并使用 mit 工具教程,最后,它成功了。

  1. 在一个窗口中运行 make CPUS=1 qemu-gdb
  2. 在另一个窗口中运行 riscv64-unknown-elf-gdb

忽略 Python 异常

关于linux-kernel - 使用 QEMU 和 GDB 调试 xv6 时无法访问内核空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60795578/

相关文章:

android - 编译Android Qemu镜像

ubuntu - QEMU 没有图形模式问题

linux - Kmalloc 对齐

android - 引导加载程序如何在 "restarting system with command"之后获取命令?

清零 vmalloc 区域时 Linux 崩溃

iphone - 如何将时间字符串插入 GDB 日志中?

python - 程序执行后

linux - 不依赖于特定于操作系统的核心转储的崩溃进程的回溯

gdb - 如何在GDB中打印寄存器地址?

c - 使用libvirt API在C程序中获取KVM虚拟机域名