嵌入式基础知识-3

C++软件与嵌入式软件面经解析大全(蒋豆芽的秋招打怪之旅)


本章讲解知识点

  • 1.1 嵌入式计算机系统的发展
  • 1.2 嵌入式计算机系统的定义与组成
  • 1.3 嵌入式操作系统以及用户应用软件
  • 1.4 ARM简介
  • 1.5 ARM体系结构
  • 1.6 其他典型微控制器
  • 1.7 BootLoader
  • 1.8 典型的BootLoader——U-Boot
  • 1.9 驱动程序与设备
  • 1.10 总线
  • 1.11 串行与并行、同步与异步、半双工与全双工
  • 1.12 内部总线
  • 1.13 系统总线
  • 1.14 外部总线

受众:本教程适合于C/C++已经入门的学生或人士,有一定的编程基础。

本章节仅适合于嵌入式软件求职的学生或人士。

img

故事背景

img

蒋 豆 芽:小名豆芽,芳龄十八,蜀中人氏。卑微小硕一枚,科研领域苟延残喘,研究的是如何炒好一盘豆芽。与大多数人一样,学习道路永无止境,间歇性踌躇满志,持续性混吃等死。会点编程,对了,是面对对象的那种。不知不觉研二到找工作的时候了,同时还在忙论文,豆芽都秃了,不过豆芽也没头发啊。

隔壁老李:大名老李,蒋豆芽的好朋友,技术高手,代码女神。给了蒋豆芽不少的人生指导意见。

导 师:蒋豆芽的老板,研究的课题是每天对豆芽嘘寒问暖。

img

故事引入

img

蒋 豆 芽:我得意的笑,我得意的笑。。。。。。

隔壁老李:(笑容邪魅)哟,豆芽,你怎么这么开心啊。

蒋 豆 芽:学校无限期延迟开学,这是我放得最长的一个寒假了呀,但是听说九月份开学。

隔壁老李:这样啊,但是你也要找工作啊,还要改论文,所以这么长的假期似乎跟你没啥关系。

蒋 豆 芽:我。。。。。。害,我这就滚去学习。

隔壁老李:别走,豆芽,趁着假期长,好好学习,我们再来讲讲嵌入式相关内容吧。

蒋 豆 芽:好!我爱学习!


隔壁老李:豆芽,我们在上一章讲了ARM的架构体系,对于嵌入式学习来说是很重要的内容,我们接下来讲讲另外的面试常考知识。

隔壁老李:我们先来讲讲BootLoader

蒋 豆 芽:嗯?BootLoader?好像听说过,但是没有深入了解。

img

1.7 BootLoader

img

隔壁老李:那我们就来好好学习学习。嵌入式系统从软件的角度看通常可分为四层,从下往上分别是BootLoader、内核、文件系统和应用程序,如图:

img

作为嵌入式系统软件的最底层,Bootloader是上电后启动的第一个程序,它类似于PC机上的BIOS程序功能,主要负责整个硬件系统的初始化和软件的启动准备工作。其最主要的作用是,为操作系统的启动和正常运行提供合适的硬件和软件的环境

但是嵌入式系统的Bootloader和PC机的BIOS程序相比要简单得多,并且侧重点也有较大的不同。

蒋 豆 芽:你看我大概总结一下。一般来说,BootLoader就是在运行操作系统内核之前所运行的一段小程序。通过这段小程序,可以对系统的硬件设备进行初始化、建立内存空间的映射图,从而将系统的软、硬件设置成一个合适的环境,以便为最终调用操作系统内核做好准备。嵌入式BootLoader的核心任务就是引导嵌入式操作系统运行起来

隔壁老李:是的,是这个意思。我们继续。一般来说,不同的CPU体系结构需要有不同的BootLoader。当然,有些功能强大的BootLoader也会同时支持多种体系结构的CPU,U-Boot就同时支持多种体系结构,如x86、ARM和PPC等。

BootLoader不仅依赖于CPU的体系结构,也依赖于具体的嵌入式板级设备的配置,比如硬件地址分配,RAM芯片的类型及其他外设的类型等。也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,如果它们的硬件资源和配置不一致,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,还需要对BootLoader进行裁剪和移植

表中列出了现有的各种BootLoader及它们所支持的体系结构。

BootLoader Monitor 支持的体系结构 说明
LILO No x86 Linux主要的引导装载程序
GRUB No x86 LILO的GNU版本
ROLO No x86 不需要BIOS可以直接从ROM中载入Linux
Loadlin No x86 允许从DOS加载Linux
Etherboot No x86 允许从Ethernet网卡启动ROMable Loader
LinuxBIOS No x86 以Linux为代表的替代品
Compaq Yes ARM 主要用于Compaq iPAD的多功能装载程序
Blob No ARM 来自LART硬件计划的装载程序
PMON Yes MIPS Agenda VR3中使用的装载程序
YMON Yes MIPS MIPS中使用的装载程序
sh-boot No SuperH LinuxSH计划中使用的装载程序
U-Boot Yes x86、ARM、PowerPC 以PPCBoot和ARMboot为基础的通用装载程序
RedBoot Yes x86、ARM、PowerPC、MIPS、SuperH 以eCos为基础的装载程序

RedBoot:它基于eCos(Embedded Configurable Operating System)操作系统的硬件抽象层(Hard Abstraction Layer,HAL)。eCos是以高度“可设定性”和“模块性”为发展目标的嵌入式操作系统,RedBoot可看作是在它上面开发的一个BootLoader。

蒋 豆 芽:那BootLoader是如何安装和启动的呢?

隔壁老李:嵌入式系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。比如,基于ARM7TDMI内核的CPU在加电或复位时,通常都从地址0x00000000取它的第一条指令。而基于这种CPU构建的嵌入式系统,都有某种类型的固态存储设备被映射到这个预先安排的地址上。从而可以使系统在加电后,CPU首先执行BootLoader程序。

如图所示为BootLoader启动流程示意图。

img

其中,BootLoader、内核启动参数及其他的系统映像在固态存储设备上的分配结构基本上类似于图所示的结构。

img

通常多阶段的BootLoader能提供更为复杂的功能及更好的可移植性。从固态存储设备上启动的BootLoader大多都是一个两阶段的启动过程,也就是说启动过程可以分为stage1stage2两部分。

依赖于CPU体系结构的代码,如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,其代码量一般不会超过256B;由于是在内核启动前运行的第一个程序,因此它是在Flash上运行的;有的文献把这一阶段称为“Flashloader”阶段。

stage2则代码量大,有上千行,通常用C语言来实现,多数时候需要嵌入汇编语言,可以实现复杂的功能;代码具有更好的可读性和可移植性;在SDRAM等随机存储器中运行;这一阶段是真正的“BootLoader”阶段。

我们总结一下:

BootLoader的stage1通常包括以下步骤:

  • 硬件设备初始化。
  • 为加载BootLoader的stage2准备RAM空间。
  • 复制BootLoader的stage2到RAM空间中。
  • 设置好堆栈。
  • 跳转到stage2的C入口点。

BootLoader的stage2通常包括以下步骤:

  • 初始化本阶段要使用的硬件设备。
  • 检测系统内存映像。
  • 将kernel映像和根文件系统映像从Flash上读到RAM空间中。
  • 为内核设置启动参数。
  • 调用内核。

隔壁老李:我们再来讲下BootLoader的工作模式。大多数BootLoader都包含两种不同的操作模式:“启动加载模式”和“下载模式”,这种区别仅对开发人员有意义。但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。

启动加载(BootLoading)模式:这种模式也称为“自主”(autonomous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布时,BootLoader显然必须工作在这种模式下。

下载(DownLoading)模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机(host)下载文件,比如:下载更新的BootLoader、下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的Flash类固态存储设备中。

像U-Boot或Blob等这样功能强大的BootLoader通常同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。比如,U-Boot在启动时处于正常的启动加载模式,但是它会延时10s等待终端用户按下任意键而将U-Boot切换到下载模式。如果在10s内用户没有按键,则U-Boot继续启动Linux内核。

蒋 豆 芽:明白了。

img

1.8 典型的BootLoader——U-Boot

img

隔壁老李:我们再介绍一下典型的BootLoader——U-Boot

U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。

但是U-Boot不仅仅支持嵌入式Linux系统的引导,还支持相

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

<p> - 本专刊适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专刊适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 - 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共近400道,知识点讲解全面。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。 </p> <p> <br /> </p>

全部评论

相关推荐

评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务