对于Linux内核开发而言使用qemu是很方便的手段,本文主要介绍linux内核开发环境的搭建过程,主要包括内核编译、使用qemu启动编译好的内核,以及构建根文件系统,使用GDB来调试内核等内容。
Linux内核编译
git clone https://github.com/torvalds/linux.git
make ARCH=x86_64 x86_64_defconfig make ARCH=x86_64 menuconfig
使用编译选项增加debug信息
Kernel hacking Compile-time checks and compiler options ---> [*] Compile-time checks and compiler options ---> [ ] Reduce debugging information [*] Provide GDB scripts for kernel debugging
Qemu启动Linux内核
qemu-system-x86_64 \ -kernel arch/x86/boot/bzImage \ -boot c -m 2048 \ -append "root=/dev/zero rw console=ttyS0,115200 acpi=off nokaslr" \ -nographic
目前没有配文件系统,启动内核会提示错误
buildroot配置根文件系统
git clone https://github.com/buildroot/buildroot
make menuconfig Target Options -> Target Architecture (X) x86_64 Filesystem images -> ext2/3/4 root filesystem (X) ext4
启动Linux内核和rootfs,登录buildroot login: 输入root即可
qemu-system-x86_64 \ -kernel arch/x86/boot/bzImage \ -boot c -m 2048 \ -hda /path/to/buildroot/output/images/rootfs.ext4 \ -append "root=/dev/sda rw console=ttyS0,115200 acpi=off nokaslr" \ -nographic
GDB调试Linux内核
用GDB调试内核时需要在Kernel hacking中开启对应打编译选项,然后qemu启动时增加 -s -S 选项
qemu-system-x86_64 \ -kernel arch/x86/boot/bzImage \ -boot c -m 2048 \ -hda /path/to/buildroot/output/images/rootfs.ext4 \ -append "root=/dev/sda rw console=ttyS0,115200 acpi=off nokaslr" \ -nographic \ -s -S
启动后再开启一个shell启动gdb
gdb ./vmlinux (gdb) target remote localhost:1234 Remote debugging using localhost:1234 0x000000000000fff0 in exception_stacks () (gdb) break start_kernel Breakpoint 1 at 0xffffffff82b3caa9: file init/main.c, line 850. (gdb) continue Continuing. Breakpoint 1, start_kernel () at init/main.c:850 850 { (gdb) list 845 { 846 rest_init(); 847 } 848 849 asmlinkage __visible void __init __no_sanitize_address start_kernel(void) 850 { 851 char *command_line; 852 char *after_dashes; 853 854 set_task_stack_end_magic(& init_task); (gdb)