qemu模擬vexpress開發板

1. 問題背景

  最近了解到一個強大的開源虛擬機軟件:qemu。利用它能夠仿真arm板,正好能夠用來鞏固一下移植相關的操做。網上關於qemu仿真vexpress開發板的例子較多,我試了幾個,感受仍是下面這篇文章比較靠譜:html

  http://www.javashuo.com/article/p-rulgwahw-bm.html 。目前我進行到用qemu加載u-boot,或者加載內核並掛載ramdis根文件系統,也能夠利用u-boot來引導內核啓動,可是沒法掛載根文件系統。linux


2. 環境介紹

  虛擬機系統: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 ?

 


3. U-boot配置

3.1 u-boot缺省配置

  在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

 

3.2 u-boot環境變量

  這裏主要設置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; "

3.3 生成u-boot.bin

  一樣使用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中有所體現。

  


4. Linux內核配置

  和u-boot的配置步驟相似。先找找缺省配置文件。

ls arch/arm/configs/ | grep vexpress

  

  make 默認配置。

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

4.1 內核加載地址和啓動選項配置

  編譯內核咱們能夠經過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" \

  


5.  busybox製做根文件系統

5.1 配置busybox

  本文製做的根文件系統 = 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個文件的做用:

  1. /etc/fstab 文件負責配置Linux開機時自動掛載的分區。
  2. rcS是一個腳本文件,在inittab文件中本解析調用,用於配置Linux系統。這個能夠參考https://www.cnblogs.com/lp1129/articles/3148858.html
  3. init程序須要讀取配置文件/etc/inittab.inittab是一個不可執行的文本文件,它有若干行指令所組成。能夠參考https://www.cnblogs.com/jason-lu/articles/3272963.html
  4. /etc/profile:這個文件是每一個用戶登陸時都會運行的環境變量設置,注意是全局的

  到目前爲止,一個mini的根文件系統就製做好了,咱們能夠經過nfs來直接掛載到這個rootfs,也能夠把它製做成ramdisk鏡像,直接燒錄到flash中。

5.2 製做ramdisk鏡像

  運行如下命令,這裏解釋一下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

 

 6. 結果

  理想結果,用qemu加載u-boot,再經過u-boot來引導內核,內核直接加載ramdisk,或者經過nfs來加載rootfs。

  實際結果:上面黃字標註的沒有實現成功。。。

  以下圖,u-boot自啓動後成功從tftp服務器下載了內核鏡像和ramdisk。

  可是沒法掛載根文件系統:

相關文章
相關標籤/搜索