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

2. 編譯內核
解壓下載的kernel文件,進入解壓后的文件夾,運行下面的指令編譯。
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目錄,該目錄下的程序就是單板運行所需要的命令。
形成根目錄結構
#!/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-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模擬vexpress-a9 (二) --- 創建根文件系統
用Qemu模擬vexpress-a9(一) --- 搭建Linux kernel調試環境