.. Kenneth Lee 版权所有 2018-2020
:Authors: Kenneth Lee :Version: 1.0
X86上的ARM Linux调试环境
以前写过怎么在PC上调试Linux内核::doc:怎样快速调试Linux内核
。那个是在x86上调
试x86平台的,用的是x86本地的软件。这里再介绍一下怎么在x86(模拟)调试ARM平台。
我个人的日常工作环境都是这个平台,我个人也更推荐这个平台。因为我个人在这个平台
上遇到的问题更少一些。
本文中涉及的部分配置或者脚本我会合并到前面这个x86@x86共享的工程中: nekin2017/lk-tester-maker,放在在ARM64的目录下。
我用的Ubuntu,所以方案只在Ubuntu 18.04.1 LTS上验证过。Ubuntu对aarch64的支持已经 很好了,你可以直接装aarch64的工具链:::
apt-get install gcc-8-aarch64-linux-gnu
qemu支持arm64的版本也可以直接装
apt-get install qemu-system-arm
唯一比较恶心的是现在aarch64的gdb主线还有问题(有个头文件冲突的问题没有解决), 所以没有gdb版本,如果你在乎,去这里下Linaro的gcc 二进制版本(里面带gdb):
http://releases.linaro.org/components/toolchain/binaries/gcc-8/
这样基础就有了,编译内核你肯定会了(自己根据需要调整参数):::
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j4 O=$BUILD_DIR
配置用默认配置就可以了,我建议开9pfs,在我前面共享的工程中,我放了一个4.19的 config.kernel.aarch64_debug,你懒得调,就用这个。
然后是文件系统部分,我是用buildroot来编译的,从这里下工程:::
git clone git://git.buildroot.net/buildroot
肯定可以用的配置我放在共享工程的arm64目录下了:config.buildroot.aarch64_debug。
编译完,把对应的根文件系统配置到内核的CONFIG_INITRAMFS_SOURCE配置项中。
然后这样运行这个系统:::
qemu-system-aarch64 \
-s -cpu cortex-a57 -machine virt \
-nographic -smp 1 -m 1024m -kernel arch/arm64/boot/Image \
-device virtio-net-pci,netdev=net0 \
-netdev type=user,id=net0,hostfwd=tcp::5555-:22 \
-fsdev local,id=p9fs,path=p9root,security_model=mapped \
-device virtio-9p-pci,fsdev=p9fs,mount_tag=p9 \
-append "console=ttyAMA0 mymodule.dyndbg=+p debug"
这是一个能跑的配置,你自己根据需要调整吧。
它共享了一个虚拟目录(这里是p9root)到虚拟机里面,你可以在虚拟机控制台上直接运 行如下命令mount:::
mount -t 9p p9 /mnt
这样很容易在本地编译用户态的代码,然后丢虚拟机里面去运行。
要单步调试内核,可以用启动aarch64的gdb,然后::
gdb> file <your_kernel_vmlinux_file>
gdb> target remote :1234
然后设断点就行了。我一般不用单步执行,一方面这东西没什么用,调试程序不应该靠单 步的。另一方面是Linux Kernel必须-O2编译,代码优化过后,基本上执行过程和代码序列 对不上。但这个东西启动运行一次只需要十几秒,比启动一台Server动辄几分钟不可同日 而语。所以,一般的功能调试,用这个是最快的和最方便的。