最近了解到一個強大的開源虛擬機軟件:qemu。利用它能夠仿真arm板,正好能夠用來鞏固一下移植相關的操做。網上關於qemu仿真vexpress開發板的例子較多,我試了幾個,感受仍是下面這篇文章比較靠譜:html
http://www.javashuo.com/article/p-rulgwahw-bm.html 。目前我進行到用qemu加載u-boot,或者加載內核並掛載ramdis根文件系統,也能夠利用u-boot來引導內核啓動,可是沒法掛載根文件系統。linux
虛擬機系統:Ubuntu 14.04express
u-boot: u-boot-2015-04bash
linux kernel: linux-3.4.4服務器
busybox: busybox-1.21.0架構
toolchain: arm-none-linux-gnueabi- (4.6.4)app
qemu: QEMU emulator version 1.7.91工具
這個qemu是直接經過apt在線安裝的,在模擬某個arm板前,先看看qemu支不支持。oop
1 qemu-system-arm -M ?
在u-boot-2015.04目錄下,先看看關於vexpress的默認配置有哪些,這裏咱們選vexpress_ca9x4_defconfig來進行默認的配置,使用make指令,能夠在命令行指定架構和交叉編譯器,也能夠寫死在Makefile中。 測試
1 ls configs/ | grep vexpress 2 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- vexpress_ca9x4_defconfig
這裏主要設置bootargs,bootcmd和bootm。咱們能夠把這些東西寫死到include/configs/vexpress_common.h中,不然就要進入u-boot後手動敲命令設置,並且設置好後也不能save(沒有flash)。
bootcmd:對應宏CONFIG_BOOTCOMMAND,是u-boot啓動時會自動執行的命令。
bootargs:是u-boot傳遞內核的參數。
bootm: ${kernel_addr} ${ramdisk_addr} ${dtb_addr} 依次是內核鏡像地址,根文件鏡像地址,設備樹地址
211 /* Basic environment settings */ 212 #if 0 213 #define CONFIG_BOOTCOMMAND "run bootflash;" //將原有的宏註釋掉 214 #endif 215 216 #define CONFIG_IPADDR 192.168.222.21 //本機IP 217 #define CONFIG_NETMASK 255.255.255.0 //掩碼 218 #define CONFIG_SERVERIP 192.168.222.20 //服務器IP:tftp服務和nfs服務 219 220 #define CONFIG_BOOTCOMMAND \ 221 "tftp 0x60008000 uImage3.4.4; " \ 222 "tftp 0x63000000 ramdisk_zy.img; " \ 223 "setenv bootargs root=/dev/mmcblk0 console=ttyAMA0; " \ 224 "bootm 0x60008000 0x63000000; "
一樣使用make指令,指定一下ARCH和CROSS_COMPILE。後面的-j2是指定2個核同時編譯,增長編譯速度。目標文件是一個二進制文件,u-boot.bin,這就是要燒寫到flash或者qemu要加載的對象。
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j2
生成好u-boot後,先用qemu測試一下可否加載。這裏參數的意義就直接抄過來吧。
-M vexpress-a9 模擬vexpress-a9單板,你可使用-M ?參數來獲取該qemu版本支持的全部單板
-m 512M 單板運行物理內存512M
-kernel /root/tq2440_work/kernel/linux-stable/out_vexpress_3_16/arch/arm/boot/zImage 告訴qemu單板運行內核鏡像路徑
-nographic 不使用圖形化界面,只使用串口
-append "console=ttyAMA0" 內核啓動參數,這裏告訴內核vexpress單板運行,串口設備是哪一個tty。
20 qemu-system-arm \ 21 -M vexpress-a9 \ 22 -m 256M \ 23 -kernel /home/linux/qemu_linux/u-boot-2015.04/u-boot \ 24 -serial stdio \ 25 -append "root=/dev/mmcblk0 nolock rw console=tty0" \
啓動後使用print指令打印環境變量,能夠發如今3.2中設置的環境變量在u-boot中有所體現。
和u-boot的配置步驟相似。先找找缺省配置文件。
ls arch/arm/configs/ | grep vexpress
make 默認配置。
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- vexpress_defconfig
編譯內核咱們能夠經過menucofig先看一下具體的配置內容。在boot option中咱們能夠配置一下下圖中的內容,這是用來設定內核啓動一些參數,能夠經過boot loader來傳遞參數(bootargs),也能夠設定默認參數。
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
編譯內核。這裏要說明一下LOADADDR=0x60008000,在上一篇博客我有簡單的蒐集一些資料,能夠參考(雖然仍是似懂非懂。。。),不過按照設置能夠在qemu中跑起來。這裏的LOADADDR我是參考arch/arm/mach-vexpress/Makefile.boot來設置的,其內容以下圖。
這裏直接生成了uImage(用於u-boot引導),固然zImage也會同時生成。若是編譯過程當中提示缺乏mkimage工具,能夠經過apt在線安裝,也能夠本身下,這裏就再也不多說。
make LOADADDR=0x60008000 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage -j2
一樣,能夠先用qemu加載一下。內核能夠起來,可是因爲沒有指定根文件系統,內核會報錯。因此下一步咱們要製做根文件系統。
20 qemu-system-arm \ 21 -M vexpress-a9 \ 22 -m 256M \ 23 -kernel uImage \ 24 -serial stdio \ 25 -append "root=/dev/mmcblk0 nolock rw console=tty0" \
本文製做的根文件系統 = busybox(包含基礎的Linux命令) + 運行庫 。那麼根文件系統放在哪裏?依賴於每一個開發板支持的存儲設備,能夠放到Nor Flash上,也能夠放到SD卡,甚至外部磁盤上。最關鍵的一點是你要清楚知道開發板有什麼存儲設備。
進入busybox,運行 make menuconfig。配置靜態創建busybox。
File systems ---> Pseudo filesystems ---> [*] Virtual memory file system support (former shm fs) [*] Tmpfs POSIX Access Control Lists
而後運行 make install 。完成後,會在busybox目錄下生成_install目錄,該目錄下的程序就是單板運行所須要的命令。將這裏面的內容所有複製到一個新建的文件夾,如rootfs下面。
還有很重要的一點就是etc/目錄下的內容,這裏通常有4個文件,能夠手動進行配置,也能夠直接從網上下。http://files.cnblogs.com/files/pengdonglin137/etc.tar.gz
簡單說一下4個文件的做用:
到目前爲止,一個mini的根文件系統就製做好了,咱們能夠經過nfs來直接掛載到這個rootfs,也能夠把它製做成ramdisk鏡像,直接燒錄到flash中。
運行如下命令,這裏解釋一下4-7的做用,先建立一個臨時目錄,用於掛載製做好的根文件系統,再把rootfs的內容複製到這個根文件系統中,相似於咱們平時使用u盤。
1 sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=32 2 sudo mkfs.ext3 rootfs.ext3 3 4 sudo mkdir -p tmpfs 5 sudo mount -t ext3 rootfs.ext3 tmpfs/ -o loop 6 sudo cp -r rootfs/* tmpfs/ 7 sudo umount tmpfs·
接下來,用qemu加載內核和ramdisk。最後的 -sd 便是模擬一個sd卡,裏面存放着跟文件系統。
qemu-system-arm \ -M vexpress-a9 \ -m 256M \ -kernel /home/linux/qemu_linux/linux-3.4.4/arch/arm/boot/zImage \ -nographic \ -append "root=/dev/mmcblk0 rw console=ttyAMA0" \ -sd ~/qemu_linux/rootfs.ext3
理想結果,用qemu加載u-boot,再經過u-boot來引導內核,內核直接加載ramdisk,或者經過nfs來加載rootfs。
實際結果:上面黃字標註的沒有實現成功。。。
以下圖,u-boot自啓動後成功從tftp服務器下載了內核鏡像和ramdisk。
可是沒法掛載根文件系統: