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网络根文件系统》。
Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核的更多相关文章
- Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统
Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...
- Qemu搭建ARM vexpress开发环境(一)
Qemu搭建ARM vexpress开发环境(一) 标签(空格分隔): Qemu ARM Linux 嵌入式开发离不开硬件设备比如:开发板.外设等,但是如果只是想学习研究Linux内核,想学习Linu ...
- 通过buildroot+qemu搭建ARM-Linux虚拟开发环境
1. 配置工作环境 sudo apt install gcc build-essential bison flex gettext tcl sharutils libncurses-dev zlib1 ...
- CentOS 7 利用qemu模拟ARM vexpress A9开发板
听说qemu用于仿真arm很不错,今日就来试了一把.由于刚刚开始,了解的并不多.本文仅仅记录Qemu装载Linux kernel和busybox根文件系统的过程.后续将会深入了解仿真的其他内容. 先上 ...
- 二、搭建struts2的开发环境
二.搭建struts2的开发环境 下载地址:http://struts.apache.org 解压后的目录结构: apps:框架本身提供一些案例(学习) docs:框架本身提供的文档(指南和API). ...
- Android开发学习总结(二)——使用Android Studio搭建Android集成开发环境
有很长一段时间没有更新博客了,最近实在是太忙了,没有时间去总结,现在终于可以有时间去总结一些Android上面的东西了,很久以前写过这篇关于使用Android Studio搭建Android集成开发环 ...
- 基于 QEMU进行 arm 仿真开发 (以 vexpress-a9 为例)
背景 基于 QEMU 的仿真可以节省 硬件成本. 参考:<qemu-system-arm仿真vexpress-a9踩坑记>.<在Ubuntu下使用QEMU搭建arm开发环境(一)搭建 ...
- Windows下搭建Spark+Hadoop开发环境
Windows下搭建Spark+Hadoop开发环境需要一些工具支持. 只需要确保您的电脑已装好Java环境,那么就可以开始了. 一. 准备工作 1. 下载Hadoop2.7.1版本(写Spark和H ...
- 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
随机推荐
- ICO图标在线生成,php生成ICO图标在线制作源码
我们做web系统的时候,每个浏览器的tab这里都会有一个图标,这个图标叫favicon图标,favicon.ico文件放在系统的根目录 如果程序员没有ICO制作工具,那么要如何生成图标呢?可以用程序来 ...
- iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425)
原文:iis启动 服务无法在此时接受控制信息. (异常来自 HRESULT:0x80070425) 问题描述:每隔一段时间应用程序池就会自动停止,报错:服务无法在此时接受控制信息. (异常来自 HRE ...
- 简明Python3教程 18.下一步是什么
如果你有认真通读本书之前的内容并且实践其中包含的大量例程,那么你现在一定可以熟练使用python了. 同时你可能也编写了一些程序用于验证python特性并提高你的python技能.如果还没有这样做的话 ...
- silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发) 有个问题想请教下大家,我仿了腾讯的SL版QQ,相似度95%以上.我想写成教程教大家怎么开发出来,会不会 ...
- oracle备份和升级数据库
同oracle用户登录数据库驻留server.例如,主文件夹/home./oracle.运行以下命令来执行备份操作. sqlplus /nolog connect /as sysdba sql> ...
- 【转】opencart 源码解析
前台控制程序列表-catalog/controller Catalog|controller|account 会员功能 |—— account.php 会员功能主頁|—— address.php 会员 ...
- NPM镜像设置方法!
使用npm安装一些包失败了的看过来(npm国内镜像介绍) 发布于 2012-4-26 04:19 最后一次编辑是 2013-12-11 23:21 这个也是网上搜的,亲自试过,非常好用! 镜像使用方法 ...
- WPF特效-鱼游动动画
原文:WPF特效-鱼游动动画 实现思路: 通过VisualBrush Binding方式获取鱼局部图像,在Viewport3D中创建ModelVisual3D块并把获取到的局部 ...
- WPF 4 Ribbon 开发 之 标签工具栏(Tab Toolbar)
原文:WPF 4 Ribbon 开发 之 标签工具栏(Tab Toolbar) 本篇将开始介绍标签工具栏的开发内容,标签工具栏可以说是Ribbon 的核心部分,应用程序所有的功能特性都会集中 ...
- js 指向表格行变色,离开恢复
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...