X86上的ARM Linux調試環境
以前寫過怎麼在PC上調試Linux內核:in nek:怎樣快速調試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動輒幾分鐘不可同日而語。所以,一般的功能調試,用這個是最快的和最方便的。
推薦閱讀: