基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行

宿主机:Ubuntu16.04 x64(Linux内核4.4.0)

交叉编译工具链:gcc-arm-linux-gnueabi
arm-linux-gcc:4.4.3
QEMU:2.5.0
Linux kernel:4.4.1
busybox:1.25.1

 

一、准备
1.创建工作目录armv7/,进入该目录
2.下载内核源码文件linux-4.4.1.tar.xz
3.下载busybox源码文件busybox-1.25.1.tar.bz2
4. https://files.cnblogs.com/files/pengdonglin137/etc.tar.gz下载内核启动配置文件etc.tar.gz,解压

 

二、编译Linux内核

在armv7/目录下
1.解压linux-4.4.1.tar.xz
2.进入linux-4.4.1目录
3.执行:

1 export ARCH=arm 
2 export CROSS_COMPILE=arm-linux-gnueabi- 
3 make vexpress_defconfig 

完成后,执行:(j2表示两个线程执行)

1 make zImage -j2 

最后执行:(一定要make dtbs,且启动时加上相应的dtb,否则内核启动不了)

1 make dtbs 

或省略以上两步直接:

1 make all 

4.在armv7/目录下新建temp/目录

5.将生成的arch/arm/boot/zImage和arch/arm/boot/dts/vexpress-v2p-ca9.dtb复制到temp/中

 

三、编译busybox
在armv7/目录下
1.解压busybox-1.25.1.tar.bz2
2.进入busybox-1.25.1目录
3.执行:

1 1 export ARCH=arm 
2 2 export CROSS_COMPILE=arm-linux-gnueabi-
3 make menuconfig

 

出现图形界面,做如下配置(这一步是可选的,如果执行了就可以不用执行cp /usr/arm-linux-gnueabi/lib rootfs/这一步):

Busybox Settings --->
  Build Options --->
    [*] Build BusyBox as a static binary (no shared libs)
完成后,执行:

1 make

完成后,执行:

1 make install

完成后,该目录下生成的_install中即是基本的busybox指令。

 

四、制作根文件系统
1. 先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与虚拟arm板上linux内核运行所需要的目录结构完全一样,然后再打包成镜像(在虚拟arm板看来就是SD卡),这个临时的目录结构称为根目录。在armv7/目录下,创建bash脚本,并运行(注意这里不能使用ext4格式,否则内核启动后文件系统是只读的,原因目前不清楚):

 1 #!/bin/bash
 2 
 3 rm -rf rootfs
 4 rm -rf tmpfs
 5 rm -rf rootfs.ext3
 6 
 7 mkdir rootfs
 8 mkdir -p rootfs/proc/
 9 mkdir -p rootfs/sys/
10 mkdir -p rootfs/tmp/
11 mkdir -p rootfs/root/
12 mkdir -p rootfs/var/
13 mkdir -p rootfs/mnt/
14 
15 cp busybox-1.25.1/_install/* rootfs/ -arf
16 cp /usr/arm-linux-gnueabi/lib rootfs/ -arf
17 cp etc rootfs/ -arf
18 
19 mkdir -p rootfs/dev/
20 mknod rootfs/dev/tty1 c 4 1
21 mknod rootfs/dev/tty2 c 4 2
22 mknod rootfs/dev/tty3 c 4 3
23 mknod rootfs/dev/tty4 c 4 4
24 mknod rootfs/dev/console c 5 1
25 mknod rootfs/dev/null c 1 3
26 
27 dd if=/dev/zero of=rootfs.ext3 bs=1M count=64
28 mkfs.ext3 rootfs.ext3
29 
30 mkdir -p tmpfs
31 mount -t ext3 rootfs.ext3 tmpfs/ -o loop
32 cp -r rootfs/* tmpfs/
33 umount tmpfs

 

五、网络配置
在armv7/目录下
1.修改etc/init.d/rcS文件,在ifconfig lo 127.0.0.1 下加一句ifconfig eth0 192.168.xxx.xxx(也可以内核启动后手动运行,但这样开机自动运行比较方便)
2.依次执行以下shell指令:

1 ifconfig ens33 down                       # 关闭ens33接口
2 brctl addbr br0                           # 添加一个虚拟网桥br0
3 brctl addif br0 ens33                     # 把ens33连接到br0上
4 ifconfig br0 promisc up                   # 以混杂模式打开br0接口
5 ifconfig ens33 promisc up                 # 以混杂模式打开ens33接口
6 dhclient br0                              # 为br0分配ip
7 tunctl -t tap0 -u root                    # 创建一个tap0接口,只允许root用户访问
8 brctl addif br0 tap0                      # 在虚拟网桥中增加一个tap0接口
9 ifconfig tap0 up                          # 打开tap0接口

 

六、系统启动运行

qemu-system-arm \
               -M vexpress-a9 \
               -m 512M \
               -kernel temp/zImage \
               -dtb temp/vexpress-v2p-ca9.dtb \
               -nographic \
               -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
               -sd rootfs.ext3 \
               -net nic \
               -net tap,ifname=tap0,script=no

 

七、后记

存在的问题:
1.显示文件系统是只读的 (已解决:文件系统格式改为ext3)
2.联网问题尝试过之前的方法,失败(已解决,宿主机内需要进行网桥、接口的配置,还要修改etc/init.d/rcS,加入一句ifconfig eth0 <ip>,<ip>是希望分配给虚拟arm板的ip)
3.ARM9选择了versatilepb (ARM926EJ-S)平台,但在启动时提示无法加载设备树,追溯问题发现是versatile-pb.dts没有编译导致dtb文件没有生成

新增问题:
1.qemu虚拟机只能与宿主机ping通,无法ping通外网
2.宿主机进行网桥、接口配置只能一条条输入shell指令完成,写成脚本运行后ping不通外网,但ifconfig信息与正确配置是一样的

 

posted @ 2017-09-01 10:58  leauky  阅读(1071)  评论(0编辑  收藏  举报