基於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. http://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信息與正確配置是一樣的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章