使用qemu运行Linux-kernel

之前想买块MTK的开发板,结果根本没有卖。。。 树莓派今年又不会出4,于是想用qemu边学边玩。

宿主OS:Ubuntu 17.04

准备工作

由于某些众所周知的原因,访问一些国外的服务器非常慢,因此推荐使用国内的镜像,我这里用的是阿里的:

换完更新源后,个人习惯装一个vim:

1
sudo apt-get install vim

安装arm交叉编译链

1
sudo apt-get install gcc-arm-linux-gnueabi

也可以装一个arm-linux-gnueabihf,如果硬件带fpu,可以使用该工具。

安装qemu

1
sudo apt-get install qemu

下载Linux kernal并编译

kernel.org下载源码包。下载完成后解包到任意目录。cd过去后,使用vim新建一个build脚本build.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
export  ARCH=arm 
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make zImage -j8
make modules -j8
make dtbs
mkdir extra_folder
cp arch/arm/boot/zImage extra_folder/
cp arch/arm/boot/dts/*ca9.dtb extra_folder/
cp .config extra_folder/

运行脚本会使用arm-linux-gnueabi进行编译,并把生成的zImage和dtb文件copy到extra_folder(不然的话每次都手动copy好累。。)

下载busybox

busybox能够提供一些基本的指令,如umount,sh,vi等等。在busybox.net下载源代码包,当然使用wget或者git clone也是可以的。解包后,cd到代码目录,再写一个build.sh:

1
2
3
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make install CROSS_COMPILE=arm-linux-gnueabi-

运行脚本将在该目录下生成一个_install文件夹。

制作根文件系统和镜像

创建rootfs

1
2
sudo mkdir rootfs
sudo mkdir rootfs/lib

复制busybox命令

1
sudo cp _install/* -r rootfs/

复制运行库

1
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

创建字符设备用于测试

1
2
3
4
5
sudo mkdir -p rootfs/dev
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty2 c 4 3
sudo mknod rootfs/dev/tty2 c 4 4

c:字符型
4:主设备号
1,2:次设备号

生成镜像并格式化生成ext3文件系统

1
2
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
mkfs.ext3 a9rootfs.ext3

复制文件到镜像中

1
2
3
4
sudo mkdir tmpfs
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs

启动qemu并运行系统

写一个runOS.sh并运行:

1
qemu-system-arm -M vexpress-a9 -m 256M -dtb extra_folder/vexpress-v2p-ca9.dtb -kernel extra_folder/zImage -append "root=/dev/mmcblk0 rw" -sd a9rootfs.ext3


然后熟悉的企鹅出现了!

拷个hello world试一下: