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上的位置关系应该类似于下图所示:

BootLoaderBootParametersKernelRootfsAppfs

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:
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸿蒙编译qemu-arm-linux产品时,没有生成vendor.img可能是因为以下几个原因: 首先,鸿蒙系统在编译时需要进行多个步骤,其中包括生成各个分区(分区包括system、vendor、boot等)。编译时如果没有指定生成vendor分区的操作,就不会在编译完成后生成vendor.img。 其次,可能是在编译鸿蒙系统时选择了一些定制化的配置,导致vendor分区没有被包含在生成的镜像中。鸿蒙系统提供了一些定制化选项,可以根据具体需求选择生成的分区。 另外,如果在编译过程中出现了错误或警告,可能导致编译过程中断,进而无法生成完整的镜像文件,其中也包括vendor.img。 要解决这个问题,可以尝试以下方法: 1. 确认编译过程中是否选择了生成vendor分区的选项,如果没有,需要重新编译时指定生成vendor分区。 2. 检查编译过程中是否出现了错误或警告,并解决其中可能导致编译中断的问题,确保编译过程可以顺利完成。 3. 检查编译使用的鸿蒙源码是否完整,如果有缺失或损坏的文件可能会导致编译过程中断,无法生成完整的镜像文件。 总结来说,如果在编译鸿蒙系统时没有生成vendor.img,首先需要确认编译过程中是否选择了生成vendor分区的选项,并检查编译过程中是否出现了错误或警告。如果以上检查均无问题,可以尝试重新编译鸿蒙系统并确保使用完整的鸿蒙源码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值