我已经能够使用以下方法来启动基于PowerPC的系统(具体来说为MPC8544DS)来调用qemu(v1.7.0)
qemu-system-ppc -M mpc8544ds -m 512 -kernel zImage -s -nographic -initrd busyboxfs.img -append "root=/dev/ram rdinit=/bin/sh kgdboc=ttyS0,115200 kgdbwait"
Run Code Online (Sandbox Code Playgroud)
其中zImage是一个自定义的交叉编译Linux内核(v2.6.32),已启用并编译了KGDB(用于启动代码调试),并且busyboxfs.img是基于busybox的rootfs。
由于我正在使用-sQemu 的标志,因此可以使用跨gdb闯入内核,如下所示:
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
mem_serial_in (p=<value optimized out>, offset=5) at drivers/serial/8250.c:405
405 }
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除该-s标志并尝试闯入内核,/dev/ttyS0则会给我一个权限被拒绝的错误:
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
permission denied
Run Code Online (Sandbox Code Playgroud)
是因为它被Qemu保留了吗?另外,在互联网上的示例中ttyAMA0,我已经了解了kgdboc ,该AMBA总线代表特定于基于ARM的系统的总线。我们对PowerPC有类似的东西吗?我在这里做错什么了吗?
我试图破解/理解nullfs内核模块(在FreeBSD上)所以为此,我做了以下事情:
在目标机器上:
kldstat给出:
Id Refs Address Size Name
1 10 0xffffffff80200000 17e10c8 kernel
2 1 0xffffffff819e2000 4cf0 vmxnet.ko
3 1 0xffffffff819e7000 16e0 echo.ko
4 1 0xffffffff81c11000 23dc vmmemctl.ko
5 1 0xffffffff81c14000 641b nullfs.ko
nm /boot/kernel/nullfs.ko | grep mount
00000000000018f0 t null_getwritemount
0000000000000540 t nullfs_mount
0000000000000930 t nullfs_unmount
U vfs_mountedfrom
U vop_getwritemount_desc
Run Code Online (Sandbox Code Playgroud)
在通过充当串行控制台的命名管道(我正在使用虚拟机)连接到目标的本地计算机上:
(kgdb) tr0
kdb_sysctl_enter (oidp=<value optimized out>, arg1=<value optimized out>,
arg2=0xfffffe004e7cc7f0,
req=<value optimized out>) at /usr/src/sys/kern/subr_kdb.c:446
446 kdb_why = KDB_WHY_UNSET;
Current language: auto; currently minimal
(kgdb) getsyms
During …Run Code Online (Sandbox Code Playgroud)