虛擬機(jī)環(huán)境

0-environment.png
QEMU運(yùn)行ARM Linux內(nèi)核
1.準(zhǔn)備工具
- 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編譯最小文件系統(tǒng)
cd busybox export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- make menuconfig

1-busyboxinstall2.png
靜態(tài)編譯設(shè)置好后,
make install
-
創(chuàng)建最小文件系統(tǒng)
cp -r _install/ ../linux-4.0 cd ../linux-4.0/_install/ mkdir etc/ dev/ mnt/ -p etc/init.d-
進(jìn)入
../linux-4.0/_install/etc/init.d,創(chuàng)建rcS文件,并寫入cd ./etc/init.d/ vi rcSmkdir -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修改為可執(zhí)行權(quán)限
chmod +x rcS -
進(jìn)入
../linux-4.0/_install/etc,創(chuàng)建fstab文件,并寫入vi fstabproc /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 -
進(jìn)入
../linux-4.0/_install/etc,創(chuàng)建inittab文件,并寫入::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r -
進(jìn)入
../linux-4.0/_install/dev,在root權(quán)限下創(chuàng)建如下節(jié)點(diǎn)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內(nèi)核源碼
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.gz

1-linuxkernelcode.png
-
設(shè)置編譯變量
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",并打開高端內(nèi)存

2-memsplit.png
-
開始編譯kernel
sudo make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- sudo make dtbs期間遇見缺少
inlude/linux/compiler-gcc7.h時(shí),可以將compiler-gcc4.h重名為compiler-gcc7.h即可

3-compile.png
報(bào)錯一般是export變量沒有起作用,修改Makefile的內(nèi)容就好了

3-compile2.png
4.運(yùn)行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關(guān)閉QEMU平臺
QEMU調(diào)試ARM Linux內(nèi)核
1.安裝ARM GDB
要確保內(nèi)核要包含調(diào)試信息
sudo apt install gcc-arm-none-eabi
Ubuntu18沒有添加到官方倉庫,需要手動安裝
參考:https://zhuanlan.zhihu.com/p/134031693
2.連接gdb
重編譯內(nèi)核,在超級終端中輸入
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相應(yīng)GDB
-s:在1234端口接受GDB調(diào)試連接
在調(diào)試窗口
arm-none-eabi-gdb -tui vmlinux

5-gdb-1.png
在gdb中
target remote localhost:1234
b start_kernel
c