Qemu搭建ARM vexpress開發環境(二)----通過u-boot啟動Linux核心

micro蝦米發表於2019-06-26

Qemu搭建ARM vexpress開發環境(二)----通過u-boot啟動Linux核心

標籤(空格分隔): Qemu ARM Linux


在上文《Qemu搭建ARM vexpress開發環境(一)》中已經簡單講述了通過Qemu模擬直接啟動Linux核心,並掛在SD卡根檔案系統的方法,這種方法是直接啟動核心,與實際應用中ARM板的啟動方式:u-boot、kernel、rootfs有些不同。現在就來講述下通過Qemu搭建通過u-boot啟動Linux核心並掛載根檔案系統的方法。

1. 開發環境簡述

嵌入式系統要正常執行,應該包含:u-boot、kernel、rootfs、appfs。這幾部分在ARM開發板Flash上的位置關係應該類似於下圖所示:

BootLoader BootParameters Kernel Rootfs Appfs

rootfs可以新增到開發板的Flash,也可以不用新增到開發板,而是部署到PC機上,開發板在執行完kernel,要掛載rootfs時,可以通過NFS網路掛載到設定好的PC機上的rootfs根檔案系統上(下一篇文章《Qemu搭建ARM vexpress開發環境(三)----NFS網路根檔案系統》會詳細講解NFS網路掛載根檔案系統的具體操作方法)。

2. 準備u-boot

用來使用u-boot啟動載入Linux核心

2.1 下載u-boot

從http://ftp.denx.de/pub/u-boot網站選擇一個u-boot版本原始碼下載,本文中使用的是u-boot-2017.05版本。

2.2 解壓u-boot

解壓u-boot:

# tar -xvf u-boot-2018.09.tar.bz2

2.3 編譯u-boot

直接編譯
如果沒有修改Makefile和config.mk檔案,需要在編譯時加上ARCH和CROSS_COMPILE的配置:

# make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

這種方式編譯比較直接,但是在除錯時,需要多次編譯u-boot,引數太多會帶來不便,於是可以通過以下方法,修改Makefile和config.mk檔案中的ARCH和CROSS_COMPILE選項,在編譯的時候就可以省去了在編譯命令中新增編譯配置的設定。

修改Makefile

# 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

2.4 啟動u-boot

通過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

3. 準備核心

使用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

4. Qemu網路功能設定

Qemu虛擬機器在u-boot啟動時,需要將uImage載入到記憶體,而uImage從哪裡來?可以通過TFTP伺服器下載uImage到記憶體指定地址。而在這之前需要通過橋接方式將網路連結到Xubuntu系統。

4.1 配置Qemu與主機的網路連線

採用橋接網路連線Host主機通訊
主機核心需要支援tun/tap模組

4.2 配置Xubuntu主機

安裝橋接網路依賴的兩個工具:

# 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指令碼(高版本會自動配置,不需要手動配置)

4.3 重啟系統,使配置生效

# reboot

或者:

# init 6

4.4 檢視Qemu的網路環境

# 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主機通訊的網口

5. 安裝TFTP伺服器

建立TFTP伺服器,用來給Qemu模擬開發板啟動uImage時,下載uImage到記憶體中。

1) 安裝Linux主機Host的TFTP伺服器工具:

# sudo apt install tftp-hpa tftpd-hpa xinetd

2) 修改配置檔案,設定TFTP伺服器目錄:

# sudo vim /etc/default/tftpd-hpa
......
TFTP_DIRECTORY="/home/mcy/tftpboot"
......

3) Linux主機上建立tftp目錄:

# mkdir /home/mcy/tftpboot
# chmod 777 /home/mcy/tftpboot

4) 重啟tftp服務:

# sudo /etc/init.d/tftpd-hpa restart

6. 設定u-boot中的核心啟動引數

啟動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網路根檔案系統》。

相關文章