虚拟机环境
0-environment.png
QEMU运行ARM Linux内核
1.准备工具
- qemu
- libncurses5-dev
- gcc-arm-linux-gnueabi
- build-essential
sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential
2.安装busybox
busybox工具包
-
下载
wget https://busybox.net/downloads/busybox-1.24.2.tar.bz2
1-busyboxinstall.png
-
安装
解压
tar -jxvf busybox-1.24.2.tar.bz2
编译最小文件系统
cd busybox export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- make menuconfig
1-busyboxinstall2.png
静态编译设置好后,
make install
-
创建最小文件系统
cp -r _install/ ../linux-4.0 cd ../linux-4.0/_install/ mkdir etc/ dev/ mnt/ -p etc/init.d
-
进入
../linux-4.0/_install/etc/init.d
,创建rcS文件,并写入cd ./etc/init.d/ vi 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
修改为可执行权限
chmod +x rcS
-
进入
../linux-4.0/_install/etc
,创建fstab文件,并写入vi fstab
proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0
-
进入
../linux-4.0/_install/etc
,创建inittab文件,并写入::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r
-
进入
../linux-4.0/_install/dev
,在root权限下创建如下节点joe1sn@ubuntu:~/Desktop/LinuxKernel/linux-4.0/_install/dev$ sudo mknod console c 5 1 [sudo] password for joe1sn: joe1sn@ubuntu:~/Desktop/LinuxKernel/linux-4.0/_install/dev$ sudo mknod null c 1 3
-
3.编译kernel
- 下载linux-4.0内核源码
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.gz
1-linuxkernelcode.png
-
设置编译变量
cd linux-4.0 export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- make vexpress_defconfig make menuconfig
配置initarmfs
2-initarm1.png
2-initarm2.png
- memory split为"3G/1G user/kernel split",并打开高端内存
2-memsplit.png
-
开始编译kernel
sudo make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- sudo make dtbs
期间遇见缺少
inlude/linux/compiler-gcc7.h
时,可以将compiler-gcc4.h
重名为compiler-gcc7.h
即可
3-compile.png
报错一般是export变量没有起作用,修改Makefile的内容就好了
3-compile2.png
4.运行QEMU模拟4核Cortex-A9
qemu-system-arm -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic
4-qemu.png
在另外一个terminal输入killall qemu-system-arm
关闭QEMU平台
QEMU调试ARM Linux内核
1.安装ARM GDB
要确保内核要包含调试信息
sudo apt install gcc-arm-none-eabi
Ubuntu18没有添加到官方仓库,需要手动安装
参考:https://zhuanlan.zhihu.com/p/134031693
2.连接gdb
重编译内核,在超级终端中输入
qemu-system-arm -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -S -s
-S:中断CPU相应GDB
-s:在1234端口接受GDB调试连接
在调试窗口
arm-none-eabi-gdb -tui vmlinux
5-gdb-1.png
在gdb中
target remote localhost:1234
b start_kernel
c