linux-kernel - gdb 不会在断点处停止 startup_32
问题描述
使用 qemu 和 gdb 调试 linux 内核启动。这是源分支:https ://android.googlesource.com/kernel/goldfish/+/android-goldfish-3.18 。配置是 i386_ranchu_defconfig。这是我使用的步骤:
qemu-system-i386 -kernel ~/aosp/goldfish/arch/x86/boot/bzImage -s -S
gdb ~/aosp/goldfish/vmlinux
(gdb) target remote :1234
0x0000fff0 in ?? ()
(gdb) b startup_32
Breakpoint 1 at 0xc0200000: file arch/x86/kernel/head_32.S, line 96.
(gdb) c
Continuing.
但是程序不会在 startup_32 处停止。相反,如果我将 startup_32 更改为 start_kernel 则它可以工作。
(gdb) b start_kernel
Breakpoint 1 at 0xc0b3672c: file init/main.c, line 498.
(gdb) c
Continuing.
Breakpoint 1, start_kernel () at init/main.c:498
498 {
(gdb)
为什么程序没有在 startup_32 处停止?
解决方案
startup_32 是引导代码的一部分,虚拟内存尚未设置,因此尝试在 0xc0200000(虚拟内存地址)处中断可能会锁定系统并且内核不会执行该跳转。
start_kernel OTOH,在虚拟内存初始化后发生。
推荐阅读
- graphql - 如何在中继服务器中使用删除突变?
- azure - Hive Metastore 由相同 HDInsight 版本但不同群集类型的不同群集共享
- latex - 用 Latex 写简历
- javascript - 如何在 Sapper 中离开父布局?
- php - Laravel 6.4 index.php URL重写.htaccess错误
- python - 通过嵌套的 RFECV 和 GridSearchCV 传递管道的问题
- mysql - 如何使用 group by 子句选择 min() - 不禁用 only_full_group_by sql 模式?
- javascript - [GraphQL 错误]:消息:无法解构“未定义”或“空”的属性“id”。位置:[object Object],路径:newMessage
- django - NoReverseMatch at / in django
- architecture - 定义康威定律的正确方法