Centos7 搭建qemu模擬器模擬arm-vexpress-a9開發板
-
參考:
整理: 寒水司天 https://www.cnblogs.com/phldylj/p/8299326.html
發佈: 2018-01-16 23:06
原作: 用Qemu模擬vexpress-a9 by 摩斯電碼 https://www.cnblogs.com/pengdonglin137/p/5023342.html -
轉載說明:
參考以上資料,在CentOS7中搭建成功,感謝摩斯電碼等先行的分享。搭建的時候填了一些坑,希望對來者有所幫助,以下是搭建手記。
1、交叉編譯器的下載與安裝
-
1、下載地址:http://blog.csdn.net/dldw8816/article/details/46004167
linaro.org的編譯工具鏈 (https://releases.linaro.org/components/toolchain/binaries/)
-
linaro.org, arm-linux-gnueabi, 6.3.1-2017.05
- gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi.tar.xz — 27-Feb-2018 00:35 97.8M (OK)
- gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz — 26-Feb-2018 23:50 77.0M
- runtime-gcc-linaro-6.3.1-2017.05-arm-linux-gnueabi.tar.xz — 28-Jan-2018 18:33 6.2M
- sysroot-glibc-linaro-2.23-2017.05-arm-linux-gnueabi.tar.xz — 27-Feb-2018 00:35 38.4M
-
linaro.org, arm-eabi (bare-metal, 裸機), 6.3-2017.05
ARM官方的編譯工具鏈
- arm.com, arm-eabi (AArch32 bare-metal target, 裸機), 8.2-2019.01
- AArch32 target with soft float (arm-linux-gnueabi)
-
-
2、然後解壓縮
# tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi.tar.xz
-
3、添加環境變量,假定壓縮包所在目錄爲/home,解壓後目錄爲arm-linux-gnueabi-6。
vim /etc/profile # 在最下面添加 export PATH=$PATH:/home/arm-linux-gnueabi-6/bin # 然後更新 source /etc/profile
-
4、測試是否安裝成功
arm-linux-gnueabi-gcc -v
2、qemu的安裝
-
參考:
-
步驟:
# 下載源代碼 wget https://download.qemu.org/qemu-3.1.0.tar.xz tar xvf qemu-3.1.0.tar.xz # 新建編譯目標路徑 mkdir build # 編譯 cd qemu-3.1.0 ./configure --target-list=arm-softmmu --audio-drv-list= --prefix=/root/qemu/build # 配置qemu,支持模擬arm架構下的全部單板 # ./configure --prefix=/root/xxx/build make -j8 make install # 說明: $./configure --enable-kvm --enable-debug --enable-vnc --enable-werror --target-list=arm-softmmu --audio-drv-list= # configure腳本用於生成Makefile,其選項可以用./configure --help查看。這裏使用到的選項含義如下: # --enable-kvm:編譯KVM模塊,使QEMU可以利用KVM來訪問硬件提供的虛擬化服務。 # --enable-vnc:啓用VNC。 # --enalbe-werror:編譯時,將所有的警告當作錯誤處理。 # --target-list:選擇目標機器的架構。默認是將所有的架構都編譯,但爲了更快的完成編譯,指定需要的架構即可。
3、uboot安裝
-
1)、源文件下載: http://ftp.denx.de/pub/u-boot/
wget http://ftp.denx.de/pub/u-boot/u-boot-2018.09.tar.bz2
-
2)、解壓源文件
tar jvxf u-boot-2018.01.tar.bz2 -C xxxx (xxx爲需要解壓的目錄)
-
3)、進入U-Boot 源文件目錄,然後執行:
# export CROSS_COMPILE=arm-none-eabi- export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- # 要求bison等 yum install bison flex # 編譯 make vexpress_ca9x4_defconfig make # 或執行如下2個步驟 # make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_ca9x4_defconfig # make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
編譯完成後,如果目錄下生成 u-boot 文件,則說明編譯成功。
-
4)、在U-Boot源碼目錄下編寫腳本 run.sh
qemu-system-arm -M vexpress-a9 -nographic -m 512M -kernel u-boot
然後 chmod +x run.sh 增加文件執行權限。
-
5)、最後執行./run.sh,可以看到啓動了bootloader,但是會提示沒有映像文件
smc911x: MAC 52:54:00:12:34:56 Wrong Image Format for bootm command ERROR: can't get kernel image! =>
按 Ctrl+a,X 退出
4、編譯內核
-
參考博文: http://blog.csdn.net/aggresss/article/details/54946438
-
Git clone
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
-
直接下載
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v3.x/linux-3.18.135.tar.xz
-
1)、從arch/arm/configs下找到需要編譯內核的配置文件vexpress_defconfig,複製到源碼根目錄下
-
2)、執行命令
# export CROSS_COMPILE=arm-none-eabi- # export ARCH=arm make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig # 生成vexpress開發板的config文件 make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm zImage make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm modules make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm dtbs
-
3)、編譯後生成 在 arch/arm/boot 目錄下生成 zImage 文件,則說明編譯成功。
- 測試
qemu-system-arm -M vexpress-a9 -m 512M -kernel zImage -nographic -append "console=ttyAMA0"
- 內核啓動參數中的console=參數應該填上哪個tty?
- 參考:https://blog.csdn.net/qingtian12138/article/details/53609526
- 解決: 因爲不同單板串口驅動類型不盡相同,創建的tty設備名當然也是不相同的。那vexpress單板的tty設備名是哪個呢? 其實這個值可以從生成的.config文件CONFIG_CONSOLE宏找到。
- 測試
-
4)、關於內核版本
- 參考: https://www.cnblogs.com/mfmdaoyou/p/6934098.html
- 說明: 發現主線上3.18版本號和後面版本號的代碼,使用這樣的搭建方法執行不起來。眼下未查明問題的根因。假設讀者想高速搭建成功。建議選用3.16版本號的內核進行搭建。
-
5)、筆者用5.4版本的arm-none-eabi-編譯3.1.16版本的內核時,報如下錯誤
include/linux/compiler-gcc.h:106:30: fatal error: linux/compiler-gcc6.h: No such file or directory #include gcc_header(__GNUC__)
- 可在Linaro官網(https://releases.linaro.org/components/toolchain/binaries/)上下載相應版本的交叉編譯工具解決這個問題。
# 原因是因爲我使用的交叉編譯工具鏈版本太高(6.2.1版本)導致,先在內核代碼根目錄下搜索compiler-gcc* ./include/linux/compiler-gcc3.h ./include/linux/compiler-gcc5.h ./include/linux/compiler-gcc.h ./include/linux/compiler-gcc4.h # 支持的版本有3、4、5,在Linaro官網上下載5版本的交叉編譯工具鏈即可解決問題。
- 筆者用gcc-linaro-6.3.1版本的arm-linux-gnueabi編譯3.1.16時也報告上述問題,編譯3.18.135版本未有報告上述問題。
- 可在Linaro官網(https://releases.linaro.org/components/toolchain/binaries/)上下載相應版本的交叉編譯工具解決這個問題。
5、編譯busybox
-
1)、從https://busybox.net/downloads/下載busybox
-
2)、進入 Busybox 源文件目錄下執行 make menuconfig,如果報錯,則yum list ncurses,然後安裝列出來的東西
Busybox Setting -> Build options -> Build Busybox as a static binary (no shared libs) # 選中 靜態編譯。 -> Cross Compiler prefix # 交叉編譯器配置(arm-linux-gnueabi-,可make命令帶入) -> Installation options -> BusyBox installation prefix # 默認目標位置(若不指定,需手動移到rootfs;若已有rootfs,可指定rootfs位置<推薦,自動完成>)
注意:若不選中“Build Busybox as a static binary (no shared libs)”,起qemu運行時,將會報“kernel panic”錯誤!
-
3)、編譯
make distclean # 清除原有配置 make menuconfig # 配置命令選項 make CROSS_COMPILE=arm-linux-gnueabi- make CROSS_COMPILE=arm-linux-gnueabi- install # 在_install 目錄下生成編譯文件: bin sbin linuxrc usr 等
-
4)、問題
- 用arm-none-eabi-編譯busybox時,報找不到curses.h錯誤
# make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/split-include HOSTCC scripts/basic/docproc HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/kxgettext.o HOSTCC scripts/kconfig/mconf.o HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/mconf HOSTCC scripts/kconfig/lxdialog/checklist.o In file included from scripts/kconfig/lxdialog/checklist.c:24:0: scripts/kconfig/lxdialog/dialog.h:31:20: 致命錯誤:curses.h:沒有那個文件或目錄 #include CURSES_LOC
- 解決:
- 方法: 編譯application時,不適合使用**arm-none-eabi-版本的編譯器,而應該使用arm-linux-gnueabi-**版本的編譯器
- 參考: ARM交叉編譯器GNUEABI、NONE-EABI、ARM-EABI、GNUEABIHF等的區別 (http://www.veryarm.com/296.html)
6、製作根文件系統
-
1)、創建一個空白文件,32M
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
-
2)、格式化
mkfs.ext3 a9rootfs.ext3
-
3)、創建根文件系統目錄
mkdir rootfs
-
4)、拷貝busybox下的文件
cp busybox/busybox-1.26.2/_install/* -r rootfs/
-
5)、拷貝交叉編譯器的lib
mkdir rootfs/lib/ cp -P /xxx/arm-linux-gnueabi/lib/* rootfs/lib/
-
6)、創建終端設備
mkdir rootfs/dev/ mknod rootfs/dev/tty1 c 4 1 mknod rootfs/dev/tty2 c 4 2 mknod rootfs/dev/tty3 c 4 3 mknod rootfs/dev/tty4 c 4 4 mknod rootfs/dev/console c 5 1 mknod rootfs/dev/null c 1 3
-
7)、創建必要目錄
mkdir -p rootfs/proc/ mkdir -p rootfs/sys/ mkdir -p rootfs/tmp/ mkdir -p rootfs/root/ mkdir -p rootfs/var/ mkdir -p rootfs/mnt/
-
8)、創建臨時目錄並與空白文件映射,目的是將根文件系統拷貝進去
mkdir tmpfs mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop cp -r rootfs/* tmpfs/ umount tmpfs
-
0)、以上步驟的腳本
建立一個目錄,將zImage,vexpress-v2p-ca9.dtb,_install目錄拷貝在一個目錄下# 打開腳本文件 vim mkrootfs.sh # 粘貼如下內容 rm -rf rootfs rm -rf tmpfs rm -f a9rootfs.ext3 mkdir rootfs cp ../busybox/busybox-1.26.2/_install/* rootfs/ -raf # 與你的busybox的目錄有關 mkdir -p rootfs/proc/ mkdir -p rootfs/sys/ mkdir -p rootfs/tmp/ mkdir -p rootfs/root/ mkdir -p rootfs/var/ mkdir -p rootfs/mnt/ cp -arf ~/xxx/arm-linux-gnueabi-6/lib/lib rootfs/ # 與你的arm-linux-gnueabi-的目錄有關 rm rootfs/lib/*.a arm-linux-gnueabi-strip rootfs/lib/* mkdir -p rootfs/dev/ mknod rootfs/dev/tty1 c 4 1 mknod rootfs/dev/tty2 c 4 2 mknod rootfs/dev/tty3 c 4 3 mknod rootfs/dev/tty4 c 4 4 mknod rootfs/dev/console c 5 1 mknod rootfs/dev/null c 1 3 dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 mkfs.ext3 a9rootfs.ext3 mkdir -p tmpfs mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop cp -r rootfs/* tmpfs/ umount tmpfs
7、啓動
# 拷貝kernel文件到a9rootfs.ext3所在目錄,以便執行
cp -r ../kernel/linux-3.18.135/arch/arm/boot/ .
# 執行
qemu-system-arm -nographic -sd a9rootfs.ext3 -M vexpress-a9 -m 512M -kernel zImage -dtb ./dts/vexpress-v2p-ca9.dtb -append "init=/linuxrc root=/dev/mmcblk0 rw rootwait earlyprintk console=ttyAMA0"
qemu-system-arm -serial stdio -sd a9rootfs.ext3 -M vexpress-a9 -m 512M -kernel zImage -dtb ./dts/vexpress-v2p-ca9.dtb -append "init=/linuxrc root=/dev/mmcblk0 rw rootwait earlyprintk console=ttyAMA0"
8、注意
- 1)、以上在編譯前請確保export ARCH=arm ;export CROSS_COMPILE=arm-linux-gnueabi-
- 2)、若報錯,一般是某些庫沒有包含,自行百度或google
9、問題
- 1)、audio: Could not init `oss’ audio driver
- 解決: [QEMU下虛擬機內的聲卡模擬方法總結 (https://blog.csdn.net/hubbybob1/article/details/77199567)] (https://blog.csdn.net/hubbybob1/article/details/77199567)