標籤(空格分隔): Qemu ARM Linuxhtml
在上文《Qemu搭建ARM vexpress開發環境(一)》中已經簡單講述了經過Qemu模擬直接啓動Linux內核,並掛在SD卡根文件系統的方法,這種方法是直接啓動內核,與實際應用中ARM板的啓動方式:u-boot、kernel、rootfs有些不一樣。如今就來說述下經過Qemu搭建經過u-boot啓動Linux內核並掛載根文件系統的方法。linux
嵌入式系統要正常運行,應該包含:u-boot、kernel、rootfs、appfs。這幾部分在ARM開發板Flash上的位置關係應該相似於下圖所示:express
BootLoader | BootParameters | Kernel | Rootfs | Appfs |
---|
rootfs能夠添加到開發板的Flash,也能夠不用添加到開發板,而是部署到PC機上,開發板在運行完kernel,要掛載rootfs時,能夠經過NFS網絡掛載到設定好的PC機上的rootfs根文件系統上(下一篇文章《Qemu搭建ARM vexpress開發環境(三)----NFS網絡根文件系統》會詳細講解NFS網絡掛載根文件系統的具體操做方法)。ubuntu
用來使用u-boot啓動加載Linux內核vim
從http://ftp.denx.de/pub/u-boot網站選擇一個u-boot版本源碼下載,本文中使用的是u-boot-2017.05版本。服務器
解壓u-boot:網絡
# tar -xvf u-boot-2018.09.tar.bz2
直接編譯 若是沒有修改Makefile和config.mk文件,須要在編譯時加上ARCH和CROSS_COMPILE的配置:app
# make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
這種方式編譯比較直接,可是在調試時,須要屢次編譯u-boot,參數太多會帶來不便,因而能夠經過如下方法,修改Makefile和config.mk文件中的ARCH和CROSS_COMPILE選項,在編譯的時候就能夠省去了在編譯命令中添加編譯配置的設置。工具
修改Makefileoop
# vim Makefile CROSS_COMPILE = arm-linux-gnueabi-
修改config.mk
# vim config.mk ARCH = arm
編譯u-boot:
# make vexpress_ca9x4_defconfig # make -j4 scripts/kconfig/conf --syncconfig Kconfig CHK include/config.h GEN include/autoconf.mk.dep CFG u-boot.cfg GEN include/autoconf.mk *** Your GCC is older than 6.0 and is not supported arch/arm/config.mk:66: recipe for target 'checkgcc6' failed make: *** [checkgcc6] Error 1
在編譯u-boot時可能會出現一些問題,只要逐個問題解決就能夠編譯完成了,如上所示問題,能夠經過修改對應文件解決。
# vim arch/arm/config.mk ifeq ($(CONFIG_$(SPL_)SYS_THUMB_BUILD),y) #archprepare: checkthumb checkgcc6 archprepare: checkthumb checkthumb: @if test "$(call cc-name)" = "gcc" -a \ "$(call cc-version)" -lt "0404"; then \ echo -n '*** Your GCC does not produce working '; \ echo 'binaries in THUMB mode.'; \ echo '*** Your board is configured for THUMB mode.'; \ false; \ fi #else #archprepare: checkgcc6 endif #checkgcc6: # @if test "$(call cc-name)" = "gcc" -a \ # "$(call cc-version)" -lt "0600"; then \ # echo '*** Your GCC is older than 6.0 and is not supported'; \ # false; \ # fi
經過Qemu啓動命令啓動u-boot:
# qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel tools/u-boot U-Boot 2018.09 (Sep 24 2018 - 21:50:42 +0800) DRAM: 512 MiB WARNING: Caches not enabled Flash: 128 MiB MMC: MMC: 0 *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: smc911x-0 Hit any key to stop autoboot: 0 =>
至此,u-boot啓動成功,下一步開始配置u-boot的內核啓動參數,來啓動Linux內核,並掛在根文件系統。
打印u-boot的環境變量:
=> print arch=arm baudrate=38400 board=vexpress board_name=vexpress ...... scriptaddr=0x88000000 stderr=serial stdin=serial stdout=serial vendor=armltd Environment size: 4201/262140 bytes
使用u-boot引導內核鏡像: 須要將內核編譯爲uImage格式 須要指定uImage在內存中的加載地址 編譯內核時指定:make LOADADDR=? uImage -j4
在內核目錄直接編譯:
# make LOADADDR=0x60003000 uImage -j4
或者在Makefile中添加加載地址配置:
# vim linux/arch/arm/boot/Makefile LOADADDR ?= 0x60003000
再編譯生成uImage文件:
# make uImage -j4
Qemu虛擬機在u-boot啓動時,須要將uImage加載到內存,而uImage從哪裏來?能夠經過TFTP服務器下載uImage到內存指定地址。而在這以前須要經過橋接方式將網絡連接到Xubuntu系統。
採用橋接網絡鏈接Host主機通訊 主機內核須要支持tun/tap模塊
安裝橋接網絡依賴的兩個工具:
# sudo apt install uml-utilities bridge-utils
建立tun設備文件:/dev/net/tun(通常會自動建立) 修改/etc/network/interfaces文件配置網絡
# sudo vim /etc/network/interfaces auto lo iface lo inet loopback auto enp0s3 auto br0 iface br0 inet dhcp bridge_ports enp0s3
配置/etc/qemu-ifup、/etc/qemu-ifdown腳本(高版本會自動配置,不須要手動配置)
# reboot
或者:
# init 6
# ifconfig br0 Link encap:Ethernet HWaddr 08:00:27:63:e5:46 inet addr:192.168.0.105 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe63:e546/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:39 errors:0 dropped:0 overruns:0 frame:0 TX packets:64 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:10471 (10.4 KB) TX bytes:7534 (7.5 KB)
虛擬網口br0即Qemu虛擬機與Linux主機通信的網口
建立TFTP服務器,用來給Qemu模擬開發板啓動uImage時,下載uImage到內存中。
# sudo apt install tftp-hpa tftpd-hpa xinetd
# sudo vim /etc/default/tftpd-hpa ...... TFTP_DIRECTORY="/home/mcy/tftpboot" ......
# mkdir /home/mcy/tftpboot # chmod 777 /home/mcy/tftpboot
# sudo /etc/init.d/tftpd-hpa restart
啓動Qemu驗證
# cat boot.sh #! /bin/sh qemu-system-arm \ -M vexpress-a9 \ -m 512M \ -kernel u-boot \ #-dtb kernel/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ -nographic \ -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \ #-append "root=/dev/mmcblk0 rw console=ttyAMA0" \ -sd rootfs.ext3
至此,rootfs目錄下就是一個簡易的根文件系統,能夠將它製做成一個鏡像文件,將鏡像文件燒寫到開發板,或者經過Qemu中的u-boot啓動Linux內核後掛載到鏡像文件上。也能夠設置爲經過NFS網絡文件系統啓動,參考下一篇文章《Qemu搭建ARM vexpress開發環境(三)----NFS網絡根文件系統》。
原文出處:https://www.cnblogs.com/microxiami/p/11093241.html