zoukankan      html  css  js  c++  java
  • Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

    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网络根文件系统》。

  • 相关阅读:
    LinuxIP乱码
    APP前置代码脚本等基础操作及安装python库
    XP定位(APP元素定位)
    关联函数应用
    命令查看当前运行APP的包名和Activity
    android智能手机如何查看APK包名
    接口代码(requests库安装)
    python不能运行
    语音接口参数转换
    接口图片参数化
  • 原文地址:https://www.cnblogs.com/microxiami/p/11093241.html
Copyright © 2011-2022 走看看