Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

2020-02-15来源: eefocus关键字:Qemu  ARM  vexpress  开发环境  u-boot  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网络根文件系统》。

关键字:Qemu  ARM  vexpress  开发环境  u-boot  Linux内核 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488327.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统
下一篇:Qemu搭建ARM vexpress开发环境(一)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Qemu搭建ARM vexpress开发环境(一)
系统和Ubuntu系统大同小异,只是桌面封装更加简洁。1.1 所使用环境PC系统:Windows10虚拟机:VirtualBox-5.18虚拟机系统:Xubuntu模拟的开发板:vexpress1.2 搭建环境时使用的工具Qemu-2.7linux-4.4.157(Linux Kernel)u-boot-2017.05busybox-1.29.3arm-linux-gnueabi-2. 安装交叉编译工具# sudo apt install gcc-arm-linux-gnueabi3. 安装Qemu工具有两种方法可以在Linux环境下安装Qemu工具,第一种直接使用XUbuntu系统的apt工具安装,但是这种方法安装的Qemu系统版本
发表于 2020-02-15
Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统
经过上一篇《Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核》,已经实现了通过u-boot加载Kernel启动开发板,并且挂载根文件系统,本文讲述通过NFS网络挂载根文件系统。通过NFS网络根文件系统,可以实现开发板在通过u-boot启动内核后,通过NFS网络在别的PC主机上挂载根文件系统。对于开发调试阶段的工作学习提供了很大的便利,可以直接在Linux主机上开发、编译驱动或者APP,并将目标文件拷贝到NFS服务目录中进行使用(此时文件相当于被拷贝到了开发板的根文件系统中)。也可以在主机端直接修改rootfs文件系统中别的文件,等效于在开发板上直接修改。本文来介绍NFS挂载网络根文件系统
发表于 2020-02-14
基于TQ2440和Qemu的GDB+串口调试(1)
执行quit命令,再次打开ckermit还可以连上板子,并且还可以再次通过echo使kernel再次进入等待远程gdb连接模式。三、Qemu + GDB这部分参考的是笨叔叔的《奔跑吧 Linux内核》。首先需要配置内核,确保编译出来的内核包含调试信息:Kernel hacking    ----> Compile-time checks and compiler options            ----> [*] Compile the kernel with debug info在启动Qemu的时候设置两个参数:-S: 表示Qemu
发表于 2020-02-09
qemu+chroot构建arm aarch64虚拟机
在X86环境下构建出arm虚拟机可以模拟arm环境进行开发、在arm linux的文件系统中安装相应的库文件,编译arm版本等。简单介绍下在X86环境下构建ARM虚拟机的步骤。1、x86环境安装qemu-user-staticsudo apt-get install qemu-user-static2、准备arm linux根文件系统arm linux根文件系统可以直接下载干净的版本或者从运行的arm单板上进行备份获取。arm单板上备份根文件系统命令:sudo tar -cvpzf rootfs.tgz --exclude=/proc --exclude=/mnt --exclude=/sys --exclude
发表于 2020-02-06
基于嵌入式云技术的油井液位远程测试系统
。 其在嵌入式Linux系统的支撑下,通过移植KVM、QEMU虚拟机,实现了测试设备的虚拟化,测控节点和测控服务器之间采用Modbus通信协议。系统实现了实时测试和远程实时测控的功能,能有效地提高采油井的测试效率,节省人力物力财力,更节省了宝贵的时间。 1 系统体系结构 本文设计的嵌入式云测试系统是由云测试监控中心和现场测控两部分构成,现场测控设备由嵌入式测控节点与嵌入式云服务器构成。测控的总体结构如图1所示。 本文基于亚马逊公司的Eucalyptus(桉树)云平台实现了云测试监控中心的功能。Eucalyptus是用于完成对各种虚拟设备、虚拟机实例的全局性监控,对整个集群的计算资源、存储资源、网络资源进行动态配置。在云测试监控中心
发表于 2014-10-24
基于嵌入式云技术的油井液位远程测试系统
海思ARM平台交叉编译zeroMQ
在使用海思的项目中要使用到ZeroMQ这个消息队列框架,之前在PC端使用感觉不错。所以通过要通过交叉编译,将其移植到ARM平台。移植方法,可以参考 https://blog.csdn.net/sishuihuahua/article/details/77203094  以下是我使用海思交叉编译工具的方法:一、配置编译器./configure --host=arm-himix100-linux --prefix=/opt/hisi-linux/zeromq-4.1.6/arm-zeromq  --without-libsodiumarm-himix100-linux   --host
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved