CentOS 7 利用qemu模擬ARM vexpress A9開發板


聽說qemu用於仿真arm很不錯,今日就來試了一把。由於剛剛開始,了解的並不多。本文僅僅記錄Qemu裝載Linux kernel和busybox根文件系統的過程。后續將會深入了解仿真的其他內容。

先上成果圖:

1. 安裝QEMU

QEMU是一套由Fabrice Bellard所編寫的以GPL許可證分發源碼的模擬處理器,在GNU/Linux平台上使用廣泛。Bochs,PearPC等與其類似,但不具備其許多特性,比如高速度及跨平台的特性,通過KQMEU這個開源的加速器,QEMU能模擬至接近真實電腦的速度。
之前已有記錄CentOS 7編譯安裝qemu的方法:
我的版本是2.10.0

2. 編譯內核

解壓下載的kernel文件,進入解壓后的文件夾,運行下面的指令編譯。

生成vexpress開發板子的config文件:
make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm vexpress_defconfig

編譯:

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

執行啟動腳本

   #! /bin/bash                                                                                                                
    
   qemu-system-arm \
           -M vexpress-a9 \
           -m 512M \
           -kernel /home/walt740/kernel/linux-4.13.5/arch/arm/boot/zImage \
           -dtb /home/walt740/kernel/linux-4.13.5/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
           -nographic \
           -append "console=ttyAMA0"

3. 制作根文件系統

到這里是否大功告成了呢? 其實在上面的測試中,你會發現內核報panic,因為內核找不到根文件系統,無法啟init進程。 

根文件系統要考慮兩個方面:

1. 根文件系統的內容

在嵌入式領域,幾乎所有的東西,都是mini版本,根文件系統也不例外。

本文制本的根文件系統 = busybox(包含基礎的Linux命令)  + 運行庫 + 幾個字符設備

2. 根文件系統放在哪里

其實依賴於每個開發板支持的存儲設備,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盤上。最關鍵的一點是你要清楚知道開發板有什么存儲設備。

    本文直接使用SD卡做為存儲空間,文件格式為ext3格式

下載、編譯和安裝busybox

wget http://www.busybox.net/downloads/busybox-1.27.2.tar.bz2

make defconfig

make menuconfig
make CROSS_COMPILE=arm-none-linux-gnueabi- #重要 make install

安裝完成后,會在busybox目錄下生成_install目錄,該目錄下的程序就是單板運行所需要的命令。

 

形成根目錄結構

先在CentOS主機環境下,形成目錄結構,里面存放的文件和目錄與單板上運行所需要的目錄結構完全一樣,然后再打包成鏡像(在開發板看來就是SD卡),這個臨時的目錄結構稱為根目錄。
#!/bin/bash

sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -f a9rootfs.ext3

sudo mkdir rootfs
sudo cp _install/*  rootfs/ -raf

mkdir -p rootfs/{lib,proc,sys,tmp,root,var,mnt}

sudo cp -arf /usr/local/gcc-arm-none-eabi/arm-none-linux-gnueabi/lib rootfs/

sudo cp etc rootfs/ -arf sudo rm rootfs/lib/*.a sudo mkdir -p rootfs/dev/ sudo mknod rootfs/dev/tty1 c 4 1 sudo mknod rootfs/dev/tty2 c 4 2pro sudo mknod rootfs/dev/tty3 c 4 3 sudo mknod rootfs/dev/tty4 c 4 4 sudo mknod rootfs/dev/console c 5 1 sudo mknod rootfs/dev/null c 1 3 sudo dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 sudo mkfs.ext3 a9rootfs.ext3 sudo mkdir -p tmpfs sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop sudo cp -r rootfs/* tmpfs/ sudo umount tmpfs

其中,etc下是啟動配置文件,可以的到這里下載:

4. 系統啟動運行

完成上述所有步驟之后,就可以啟動qemu來模擬vexpress開發板了,命令參數如下:
qemu-system-arm -M vexpress-a9 -m 512M \
-kernel linux-kernel/linux-4.13/arch/arm/boot/zImage \
-dtb linux-kernel/linux-4.13/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic -append "root=/dev/mmcblk0  console=ttyAMA0" \
-sd a9rootfs.ext3

 

 

從內核啟動打印。到命令行提示符出現,激動人心的時刻出現了……

如果內核報錯:

[    1.965000] Failed to execute /linuxrc (error -8).  Attempting defaults...
[    1.990000] request_module: runaway loop modprobe binfmt-464c
[    2.000000] Starting init: /sbin/init exists but couldn't execute it (error -8)
[    2.020000] request_module: runaway loop modprobe binfmt-464c
[    2.030000] Starting init: /bin/sh exists but couldn't execute it (error -8)
[    2.040000] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[    1.955000] request_module: runaway loop modprobe binfmt-464c
//該錯誤是由於沒有配置交叉編譯工具  
配置busybox時,在配置中發現busybox setting->build options->
在cross compile prefix中寫入arm-none-linux-gnueabi-

 

這個錯誤可在編譯階段排除  make CROSS_COMPILE=arm-none-linux-gnueabi- #重要

 

5. qemu 退出方法

此時先按CTRL+A組合鍵並且放手后再按X鍵退出QEMU。

----------------------------------------------------------------------------

搭建的過程看似簡單,可也遇到了不少麻煩,很多都是通過百度/bing解決的。

 

參考:

從零使用qemu模擬器搭建arm運行環境

用Qemu模擬vexpress-a9 (二) --- 創建根文件系統

qemu 退出方法

 Kernel panic - not syncing: No working init found.

用Qemu模擬vexpress-a9(一) --- 搭建Linux kernel調試環境

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM