QEMU调试linux内核
1. 准备工具
首先在linux中安装以下工具
sudo apt install gcc build-essential bison flex gettext tcl sharutils libncurses-dev zlib1g-dev exuberant-ctags g++ texinfo patch vim libtool bc git
下载如下代码:
linux内核代码 https://www.kernel.org/
busybox工具包 https://www.busybox.net/
解压busybox文件:
tar -jxvf busybox-1.30.1.tar.bz2
解压linux内核文件:
cp linux-4.4.178.tar.xz /usr/src/
cd /usr/src/
xz -d linux-4.4.178.tar.xz
tar xvf linux-4.4.178.tar
安装qemu
sudo apt-get install qemu
2. 编译最小文件系统
首先利用busybox手工编译一个最小文件系统
root@ubuntu:/work/busybox-1.30.1# export ARCH=arm
root@ubuntu:/work/busybox-1.30.1# export CROSS_COMPILE=arm-linux-gnueabi-
make menuconfig
[*] Build static binary (no shared libs)
make install 生成_install目录
配置根文件系统
将安装_install文件夹拷贝至内核源码目录
root@ubuntu:/work/busybox-1.30.1# cp _install/ /usr/src/linux-4.4.178 -r
创建根文件系统目录
root@ubuntu:/usr/src/linux-4.4.178/_install# mkdir etc dev mnt
root@ubuntu:/usr/src/linux-4.4.178/_install# mkdir -p etc/init.d/
创建rcS文件
root@ubuntu:/usr/src/linux-4.4.178/_install# cd etc/init.d/
root@ubuntu:/usr/src/linux-4.4.178/_install/etc/init.d# touch rcS
root@ubuntu:/usr/src/linux-4.4.178/_install/etc/init.d# vim rcS
在rcS文件中写入以下内容
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
修改rcS文件执行权限
root@ubuntu:/usr/src/linux-4.4.178/_install/etc/init.d# chmod +x rcS
创建fstab文件,并写入下面内容
root@ubuntu:/usr/src/linux-4.4.178/_install/etc/init.d# cd ../
root@ubuntu:/usr/src/linux-4.4.178/_install/etc# touch fstab
root@ubuntu:/usr/src/linux-4.4.178/_install/etc# vim fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs default 0 0
创建initab文件,并写入以下内容
root@ubuntu:/usr/src/linux-4.4.178/_install/etc# touch inittab
root@ubuntu:/usr/src/linux-4.4.178/_install/etc# vim inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
创建设备节点
root@ubuntu:/usr/src/linux-4.4.178/_install/etc# cd ../dev/
root@ubuntu:/usr/src/linux-4.4.178/_install/dev# mknod console c 5 1
root@ubuntu:/usr/src/linux-4.4.178/_install/dev# mknod null c 1 3
内核编译前参数配置
root@ubuntu:/usr/src/linux-4.4.178/_install/dev# cd ..
root@ubuntu:/usr/src/linux-4.4.178/_install# cd ..
root@ubuntu:/usr/src/linux-4.4.178# export ARCH=arm
root@ubuntu:/usr/src/linux-4.4.178# export CROSS_COMPILE=arm-linux-gnueabi-
root@ubuntu:/usr/src/linux-4.4.178# make vexpress_defconfig
设置文件系统目录
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support (_install) Initramfs source file(s)
设置内部分布,并设置开启高端内存
Kernel Features --->
Memory split (3G/1G user/kernel split) --->
[*] High Memory Support
开启gdb功能
Kernel hacking --->
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info
编译内核,编译dtbs文件
make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Qemu运行内核
qemu-system-arm -M vexpress-a9 -smp 4 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic
运行展示:
Freeing unused kernel memory: 1456K
Please press Enter to activate this console. input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2
/ # ls
bin etc mnt sbin tmp
dev linuxrc proc sys usr
/ # cd /tmp/
/tmp # ls
/tmp #