首頁 > 軟體

Ubuntu下用QEMU搭建ARM Linux執行環境

2020-06-16 17:07:57

概述

模擬的單板為vexpress-a9,核心為cortex-a9;安裝完qemu可用以下命令檢視支援的機器:
qemu-system-arm -M ?qemu-system-arm -M help
沒有支援ST公司的板子,有支援arm9,arm11,cortex-m3,cortex-a8,cortex-a9,cortex-a15這些架構其他公司的板子,不過好多都已經停產了。

我的Ubuntu版本為16.04,64位元。

提示:1.在輸入linux命令時,一定要注意當前目錄和你命令中出現的檔案的路徑關係;
若提示找不到檔案,則優先檢查是不是路徑錯誤
2.若提示許可權不夠,加上sudoenter後,輸入你的使用者密碼即可

搭建步驟:

安裝arm的交叉編譯工具鏈

開啟ubantu終端,輸入

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc-arm-linux-gnueabi

安裝完後可用以下命令檢視是否安裝成功
dpkg -l gcc-arm-linux-gnueabi
出現ii gcc-arm-linux- 4:5.3.1-1ubu amd64 GNU C compiler for the armel arch即表明安裝成功。

安裝qemu

sudo apt-get install qemu
檢視安裝的版本:
qemu-system-arm --version
顯示版本QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.15), Copyright (c) 2003-2008 Fabrice Bellard

編譯linux核心

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.13.tar.xz
建立放核心的資料夾

sudo mkdir linux-kernel
sudo chmod 777 linux-kernel

解壓

xz -d linux-4.13.tar.xz
tar xvf linux-4.13.tar

編譯核心

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

生成的核心鐿像位於arch/arm/boot/zImage
測試qemu和核心能否執行成功

qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

/path/to/kernel/dir/是核心的編譯目錄
當末行顯示end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)說明核心正常載入,只是還沒有根檔案系統

製作根檔案系統

wget http://www.busybox.net/downloads/busybox-1.27.2.tar.bz2
解壓
tar xjf busybox-1.27.2.tar.bz2
在原始碼目錄執行

make defconfig  
make CROSS_COMPILE=arm-linux-gnueabi-  
make install CROSS_COMPILE=arm-linux-gnueabi- 

安裝完成後,該目錄下生成的_install,即是基本的執行指令

建立rootfs目錄

sudo mkdir rootfs 
sudo mkdir rootfs/lib

完善根檔案系統,先回到_install的父目錄

mkdir  _install/pro
mkdir  _install/sys
mkdir  _install/tmp
mkdir  _install/root
mkdir  _install/var
mkdir  _install/mnt
mkdir  _install/Home
mkdir -p _install/etc/init.d
git clone https://github.com/mahadevvinay/Embedded_Linux_Files.git
cp Embedded_Linux_Files/fstab _install/etc
cp Embedded_Linux_Files/inittab _install/etc
cp Embedded_Linux_Files/rcS _install/etc/init.d

更改rcS的許可權
chmod a+x _install/etc/init.d/rcS
複製完,不需要Embedded_Linux_Files,刪除掉
sudo rm -rf Embedded_Linux_Files

拷貝busybox命令
sudo cp path/_install/* -r rootfspath是你自己放_install的路徑
從工具鏈中拷貝執行庫到lib下
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib
注意所有命令中檔案若不在當前的資料夾中,都要加上絕對路徑
建立4個tty終端裝置

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/tty3 c 4 3  
sudo mknod rootfs/dev/tty4 c 4 4  

生成ext3映象檔案並掛載
sudo dd if=/dev/zero of=path/a9rootfs.ext3 bs=1M count=32 path為父目錄路徑,若當前目錄是父目錄則不用

mkfs.ext3 path/a9rootfs.ext3
mkdir tmpfs
sudo mount -t ext3 path/a9rootfs.ext3 path/tmpfs -o loop
sudo cp -r path/rootfs/* path/tmpfs
sudo umount path/tmpfs 

啟動qemu模擬系統
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel path/arch/arm/boot/zImage -dtb path/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd path/a9rootfs.ext3
按照終端最後一行的指示,按下enter鍵,即進入到模擬出的單板的根檔案系統,輸入ls可看到所製作的檔案

執行hello world

在使用者目錄下vim hello.c輸入:

#include <stdio.h>
int main()
{
printf("hello world!");
return 0;
}

編譯程式,注意用交叉編譯工具編譯
arm-linux-gnueabi-gcc-5 hello.c -o hello
將程式拷到rootfs目錄下執行以下命令:

sudo mount -t ext3 path/a9rootfs.ext3 path/tmpfs -o loop
sudo cp -r path/rootfs/* path/tmpfs
sudo umount path/tmpfs

path為你的路徑

啟動qemu模擬系統
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel path/arch/arm/boot/zImage -dtb path/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd path/a9rootfs.ext3
按照終端最後一行的指示,按下enter鍵,即進入到模擬出的單板的根檔案系統,輸入ls可看到所製作的檔案
輸入./hello
即可看到列印出hello world!

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-09/146890.htm


IT145.com E-mail:sddin#qq.com