前兩天看微信公眾號時發現了一個嵌入式模擬器,感覺很不錯,自己動手安裝了一個,折騰了幾天,下載一直是個問題,特此記錄如下
模擬器大家應該都聽說過,有的小伙伴打游戲也會安裝模擬器,今天我們介紹的主角QMEU就是一個可以用在嵌入式的模擬器,如果你想學習嵌入式,但身邊沒有開發板,這時候你可以嘗試使用它來模擬Linux內核的啟動,當然它還可以模擬ARM、MIPS等各種CPU架構,本文主要介紹模擬ARM的啟動流程
(一)環境介紹
? ? ? ? 虛擬機:VMware
? ? ? ? Ubuntu 16.04LTS
(二)安裝QEMU
我們常用的VMware和virtualBox只能在X86架構上,虛擬一臺X86計算機,但是QEMU能用在X86架構下虛擬出ARM計算機。QEMU時一個支持跨平臺的虛擬機,有兩種模式:user mode和system mode,在system mode下能夠模擬出整個計算機,可以在qemu上運行 操作系統,在user mode下,可以運行和當前平臺指令集不同的可執行程序。例如可以用qemu在x86上運行ARM的可執行程序,但是兩個平臺必須是同一種操作系統,比如Linux。
由于本文介紹ARM版本,我們可以在Ubuntu里使用sudo apt install qemu-system-arm命令去安裝,但是不太推薦此方法,Ubuntu里安裝源更新比較慢,安裝版本不確定,另外就是從官網(https://www.qemu.org/)下載源碼包來安裝,如果想了解更多,可以從閱讀官網上相關信息。
(1)從官網下載好安裝包,或者用我下載好的:qemu
wget https://download.qemu.org/qemu-5.1.0.tar.xz
(2)執行下面的命令
$: tar -xvJf qemu-5.0.1.tar.xz
$: cd qemu-5.0.1
$: ./configure
$: make & make install //如果報錯要安裝兩個文件:apt-get install libglib2.0-devapt-get install libpixman-1-dev
通過上面的安裝了32位(qemu-system-arm)和64位(qemu-system-aarch64)的模擬器,使用help命令查看支持的開發板,這里面有很多我們的開發版選項,本文以vexpress-a9 (ARM Versatile Express for Cortex-A9) 為例進行講解。
(三)編譯操作系統
?(1)編譯u-boot
? ? ? 下載u-boot代碼:
git clone https://gitlab.denx.de/u-boot/u-boot.git
//注意這個有時候會比較慢,找個合適的時間下載(比如早上),或者鏡像上下載
下載完成后可以在u-boot的configs目錄下查看配置文件,我們選擇的vexpress-a9 配置文件是vexpress_ca9x4_defconfig,
make vexpress_ca9x4_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- all//make的時候可能出錯,按照出錯提示百度相關錯誤,可能由于沒有相關命令支持,例如我安裝時提示flex找不到,執行apt-get install flex在make就成功了
//需要交叉編譯工具的可以在這里下載http://releases.linaro.org/components/toolchain/binaries/
注意:如果指定交叉編譯器的路徑一定要使用絕對路徑
?
(2)制作文件系統
以前都是使用busybox編譯,然后手動創建跟文件目錄,但是現在我們使用bulidroot可以很輕松容易的構建跟文件系統(這里感謝下文鏈接的作者提供了這么方便的工具)
buildroot下載
git clone git://git.buildroot.net/buildroot
?
上面下載的代碼并不是真正下載跟文件系統,真正下載跟文件系統是在我們配置好后,編譯時下載的。
? 執行make menuconfig來配置選項:
然后在Target opions選擇相應的目標平臺,我們這里點進去選擇arm(little-endian)即ARM架構小端模式
build options選項我這里不修改保持默認,有需要的可以自行修改
編譯工具鏈toolchain選擇外部,找到自己的編譯工具鏈位置,具體參考我的配置情況
上面的配置要注意內核頭文件和編譯工具鏈版本一樣,不知道的可以在相應選項上按h查看幫助信息
選擇對應的控制臺信息:
為了減少跟文件系統鏡像,這里在filesystem images里面選擇如下,意思是使壓縮文件系統(lz4),內核啟動時解析文件系統。
其他配置先保持默認,有需要我們再修改
執行make savedefconfig命令,就會生成新的 defconfig 文件,然后執行make命令(執行make時會連接網絡下載相關資源,注意網絡暢通)
(3)編譯kernel
? 代碼下載:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
? 不推薦使用上面的方法,下載太慢了,可以在網上直接搜相關鏡像下載,這里我使用正點原子提供的kernel作為演示,使用imx的配置文件imx_v7_defconfig
然后把上面buildroot編譯的文件系統拷貝過來
cp /opt/buildroot/output/images/rootfs.cpio .make ARCH=arm vexpress_defconfigmake ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=/交叉編譯器路徑/bin/arm-linux-gnueabihf- -j8
注意:上面一定要指定架構為arm架構
(4)系統啟動
下面我們模仿sd卡啟動過程
制作sd卡鏡像:
dd if=/dev/zero of=sd.img bs=4096 count=4096
mkfs.vfat sd.img
把編譯好的 kernel zImage 和 dtb 文件拷貝到 sd.img 中
mount?sd.img?/mnt/?-o?loop,rw
cp?arch/arm/boot/zImage?/mnt/
cp?arch/arm/boot/dts/vexpress-v2p-ca9.dtb?/mnt/
umount?/mnt
啟動qemu
qemu-system-arm -M vexpress-a9 -m 512M -kernel ../u-boot/u-boot -nographic -sd sd.img
可以看到uboot啟動了:
但是沒有找到內核,我們還需要下面的操作
查看內核執行地址相對內存的偏移地址:0x8000
在 u-boot 命令行中輸入bdinfo命令,可以查到這塊開發板內存的起始地址:
//讀取內核文件到開發板內存中
fatload mmc 0:0 0x62008000 zImage
fatload mmc 0:0 0x64008000 vexpress-v2p-ca9.dtb//啟動內核
bootz 0x62008000 - 0x64008000
(四) 總結
? 通過上面的操作我們完成了模擬內核啟動的流程,有幾個問題也折騰了好久說一下注意的幾點:
(1)編譯uboot、kernel時注意架構的選擇
(2)在內核啟動不成功,可能是sd.img沒有制作成功
? 當然qemu并不能完全替代開發板,更多的功能可以自己發掘哈哈~
?
參考文章:Linux利器:QEMU!用它模擬開發板能替代真開發板?
? ? ? ? ? ? ? ? ??QEMU編譯安裝