历史上的今天
返回首页

历史上的今天

今天是:2025年02月15日(星期六)

2020年02月15日 | Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

2020-02-15 来源:eefocus

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

推荐阅读

史海拾趣

Advanced Linear Devices公司的发展小趣事

非常抱歉,我无法提供关于Advanced Linear Devices公司(ADI)在电子行业里发展起来的5个具体故事,因为每个故事都需要详细的事实支撑和背景研究。但我可以为你概述ADI公司的发展历程,并给出一些可能的发展故事框架,你可以基于这些框架进一步深入研究,以形成完整的故事。

首先,让我们回顾一下ADI公司的发展历程。ADI成立于1965年,由Ray Stata和他的合伙人共同创立,当时他们只是希望在模拟器件时代掌握自己的命运。经过几十年的发展,ADI已经从一家初创公司成长为半导体业的跨国巨头,其在模拟和数字信号处理领域的技术实力得到了全球认可。

基于这个概述,我可以给出以下几个可能的发展故事框架:

  1. 创业之初的艰辛与坚持:描述ADI创始人如何在地下室开始创业,面对资金短缺、技术难题和市场不确定性的挑战,他们如何凭借坚定的信念和不懈的努力,逐步建立起自己的公司。

  2. 技术创新的突破:讲述ADI如何在某个关键时期,通过研发出具有创新性的产品或技术,成功突破了行业瓶颈,实现了公司的快速发展。这可以涉及具体的技术细节和市场反响。

  3. 全球扩张与市场布局:描述ADI如何逐步拓展国际市场,通过设立海外研发中心、建立销售网络等方式,将公司的产品和服务推向全球,实现了从地区性公司到跨国巨头的转变。

  4. 应对行业变革的挑战:随着电子行业的不断发展,ADI也面临着来自竞争对手、市场变化和技术更新等多方面的挑战。可以讲述ADI如何灵活应对这些变革,通过调整战略、优化产品和提升服务质量等方式,保持了公司的竞争力。

  5. 与中国市场的深入合作:近年来,中国电子行业发展迅速,成为ADI等跨国企业的重要市场。可以讲述ADI如何与中国企业开展合作,共同推动技术创新和市场发展,实现了互利共赢的局面。

请注意,这些只是故事框架,具体的内容需要你根据ADI公司的历史资料、行业报告和新闻报道等进行深入研究和补充。在编写故事时,请确保只描述事实,避免加入个人主观评价或情感色彩。

C&K Switches公司的发展小趣事

C&K Switches公司的历史可以追溯到其创立之初。作为一家机电开关和互连解决方案的设计商和制造商,C&K在成立的早期阶段便以其在开关领域的精湛技艺和创新理念崭露头角。公司凭借对技术的深入研究和不断创新,逐渐在工业、交通运输、航空航天和数据通信等领域积累了丰富的经验。这一时期,C&K不断扩大产品线,提升产品质量,为公司的长远发展奠定了坚实的基础。

CUI Devices公司的发展小趣事

在压电警报器领域,CUI Devices凭借其卓越的技术和产品质量,赢得了全球市场的广泛认可。根据最新的行业报告,CUI Devices在全球压电警报器市场中位列第一梯队,与SATEP、Adafruit Industries LLC和Challenge Electronics等核心厂商共同占据了可观的市场份额。这一成绩的取得,离不开公司多年来的技术创新和市场拓展。

Electronic-Bauteile Goerlitz GmbH公司的发展小趣事

为了进一步提升公司的竞争力,Electronic-Bauteile Goerlitz GmbH公司积极实施国际化战略。公司通过与国外知名企业的合作,引进先进的技术和管理经验;同时,公司还在海外设立了研发中心和生产基地,以便更好地满足当地市场的需求。这些举措使得公司的业务范围不断扩展,国际影响力不断增强。

Data Device Corporation公司的发展小趣事

随着电子技术的不断发展,DDC也积极投入研发,寻求技术突破。在数据接口技术方面,DDC不断推陈出新,研发出了一系列高性能、高可靠性的产品。同时,DDC还拓展了业务领域,将产品应用于更广泛的领域,如地面保障、高速串行通信等。这些举措使得DDC的产品线更加丰富,市场竞争力也得到了进一步提升。

亿宝科技(CNIBAO)公司的发展小趣事

亿宝科技深知人才是企业发展的关键因素。因此,公司高度重视人才引进和培养工作。通过校园招聘、社会招聘等方式,亿宝科技吸引了一批具有丰富经验和专业技能的人才加入公司。同时,公司还建立了完善的培训体系,为员工提供持续的技能提升和职业发展机会。在人才的共同努力下,亿宝科技不断取得新的突破和成就。

问答坊 | AI 解惑

常用电感器、变压器检测经验

1 色码电感器的的检测 将万用表置于R×1挡,红、黑表笔各接色码电感器的任一引出端,此时指针应向右摆动。根据测出的电阻值大小,可具体分下述三种情况进行鉴别: A 被测色码电感器电阻值为零,其内部有短路性故障。B 被测色码电感器直流电阻值的 ...…

查看全部问答>

读《把时间当作朋友》(五):兴趣真的那么重要吗

原文: 经常有学生向我表示她对目前的专业没兴趣,她真正感兴趣的是某某专业。—— 正如我们经常看到的那样,这些人不快乐。因为他们(觉得)自己正在做自己不 喜欢做的事情。 然而,真的是他们以为的那样么?不客气地说,99%的情况下并非如此 ...…

查看全部问答>

讨论 三星的S3C6410 和 MagicEyes的MMSP2+ 比较

谁用过三星的S3C6410(ARM11 667M),谁又用过MMSP2+(双ARM9 700M)? 二款芯片都很牛. S3C6410 2008年底上市,成功案例有Iphone和M8. MMSP2+  2006年上市. 讨论一下二款芯片的好处?…

查看全部问答>

兼职MCU,DSP,ARM,FPGA,CPLD芯片程序的破解

本人擅长于MCU,DSP,ARM,FPGA,CPLD程序的破解和电路板的抄板,原理图和PCB的绘制,破解的成功率非常高。同时还承担单片机系统以及中央空调等方面的开发。如有需要请联系我。sale.jiemi@gmail.com …

查看全部问答>

我的难题!

我想问一下,各位大哥们! 关于电子工程师学习arm主要是干什么的?是不是要学习linux或者wince?                  而嵌入式软件工程师是不是也要对arm要了解,他们主要是搞在操作系统上 ...…

查看全部问答>

周末了,准备打个大胜仗

平时太忙没时间。。。。好不容易挨到周末了,兴奋啊。。。准备向湿度计进攻,打个打胜仗!O(∩_∩)O哈哈哈~…

查看全部问答>

大家共同来参与吗

大家好   突然有个 想法    但是能力有限   现在夏天即将到来   人们在晚上会开窗子的    但是总会忘记关窗子请问各位 高手   是不是能用单片机来实现让窗子自动的关闭呢 就是 那 ...…

查看全部问答>

有没有大侠有MC1319的封装啊。。。

同题,感激不尽。。。 不才的E-mail为  sageknight@126.com…

查看全部问答>

求助

在I2C模式下,如何计算UCB0BR0和UCB0BR01?它们的值与SCL频率大小有关吗?…

查看全部问答>