第二章 Hello China的启动和初始化Word文档下载推荐.docx
- 文档编号:15788416
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:34
- 大小:311.76KB
第二章 Hello China的启动和初始化Word文档下载推荐.docx
《第二章 Hello China的启动和初始化Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第二章 Hello China的启动和初始化Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
嵌入式系统软件的写入10
HelloChina在PC机上的启动11
PC机启动过程概述11
HelloChina的引导过程13
实地址模式下的初始化16
保护模式下的初始化20
操作系统核心功能的初始化24
常见嵌入式系统的启动
典型嵌入式系统内存映射布局
一个典型的嵌入式系统,至少具备下列存储部件:
1、BootROM:
是一片可擦写的只读存储器,一般不会太大(比如,不会超过1M),用于存放嵌入式系统加电后的初始化代码,在PC机上,用于完成加电后检测(POST功能)的BIOS,与此类似;
2、Flash:
一块可擦写的存储介质,可用于存储嵌入式系统的操作系统和应用程序映象,以及嵌入式系统的配置数据等,这类介质的大小,一般比BootROM要大,比如,可以在1M到64M之间变化;
3、RAM:
即常规内存,一般情况下,嵌入式系统启动后,执行的代码和数据存放在这个位置。
这三类存储介质,一般直接通过硬件连接的方式,硬性焊接在CPU的可寻址空间内,如下图:
BootROM
Flash
SRAM/DRAM
图2-1典型嵌入式系统内存布局
这样对于这些存储设备的读写,只需要采用CPU的内存读写机制,就可以很方便的完成对这些设备的操作,无需特殊设备驱动程序的支持。
在有的嵌入式系统中,还存在另外一些类型的存储介质,比如NVROM(非易失性只读存储器)等,这些存储介质往往作为存储设备配置数据的介质而存在,有的情况下,也映射到CPU的地址空间中,其操作与Flash、BootROM等类似。
嵌入式系统的启动概述
在嵌入式系统加电后,会触发CPU的复位信号(reset),导致CPU复位。
CPU复位操作完成之后,一般情况下会直接跳转到内存空间的固定位置,取得第一条指令,开始执行。
不同的CPU,第一条开始执行的指令的位置,是不一样的,比如,在ARM系列的CPU中,第一条开始执行的指令是地址空间的开始处(即0x00000000位置,在32位CPU情况下),而在Intel系列的IA32构架CPU中,CPU开始执行的第一条指令,则是位于0xFFFFFFF0位置。
第一条指令所在的位置(一般称为启动向量),一般情况下是BootROM所在的位置,在BootROM中,存放了CPU开始执行的第一条指令,一般情况下,这是一条跳转指令,跳转到另外一个固定的位置继续执行。
一个很常用的做法是,在BootROM中,存放了嵌入式系统的初始化代码,启动向量所在的跳转指令,目标跳转地址则是这些初始化代码的开始处。
这样嵌入式系统一旦加电,第一部分正式执行的代码,就是硬件系统的初始化代码。
对于硬件系统的初始化,有的情况下会十分复杂,需要初始化的硬件芯片(或硬件设备)非常多,这样必然导致初始化代码十分庞大,这样把这些庞大的初始化代码,放在BootROM中是不合适的,因此在这种情况下,BootROM里面一般只存放了关键部件的初始化代码,比如CPU的初始化(工作模式的选择等)、MMU的初始化(页表、段表的建立)、中断控制器的初始化、简单输入/输出接口(比如,COM接口)的初始化等。
另外设备的初始化代码,跟嵌入式操作系统放在一起,作为操作系统的一部分代码来实现。
BootROM中的硬件初始化代码执行完毕,对基本的硬件环境完成初始化之后,下一步工作就是加载操作系统和应用软件了(在嵌入式领域,操作系统和应用软件往往编译在一个二进制模块中),这个过程会根据不同的配置,以及不同规模的应用,有不同的实现方式,在接下来的部分当中,我们对常见的加载方式,进行描述。
一般情况下,操作系统和应用代码的映象,存储在Flash当中,因此在加载的时候,必然涉及到对Flash的操作。
在嵌入式系统中,Flash一般是直接映射到CPU的地址空间中,这样对Flash的操作,直接通过CPU的访问内存指令,就可以完成,无需额外提供Flash设备的驱动程序。
但这种方式有一个缺点,就是占用了CPU的地址空间。
若不采取这样的方式,而是把Flash当作存储外设(比如,硬盘),则必须提供特定的驱动程序,来支撑这种形态的Flash的访问。
由于这时候操作系统还没有加载,因此这时候,Flash的驱动程序只能存放在BootROM中。
常见嵌入式操作系统的加载方式
在本节中,我们对嵌入式操作系统的加载方式,进行一个简单的描述。
之所以对嵌入式操作系统的加载方式进行描述,是为了让读者更好的了解常见的嵌入式系统的启动过程,以便可以根据实际需要,把HelloChina移植到特定的目标系统上。
●加载方式之一:
从Flash直接运行代码
这种加载方式下,嵌入式操作系统映象和应用程序映象,存放在Flash当中。
在编译的时候,操作系统和应用程序映象的二进制模块,被编译器分成了不同的节,比如TEXT节、DATA节、BSS节等。
其中,不同的节所存放的内容不同,比如,TEXT节存放了可执行代码,DATA节存放了已经初始化的全局变量,而BSS节是一个预留节,存放了未经初始化的全局变量等。
在这种加载方式下,嵌入式系统的启动过程如下(参考下图):
图2-2从Flash直接运行代码的加载过程
1、CPU复位完成,执行启动向量所在的第一条指令(位于BootROM内),这条指令往往是一条跳转指令,跳转到BootROM内的硬件初始化代码位置,执行必须的硬件初始化工作;
2、硬件初始化代码完成CPU的初始化,比如设置CPU的段寄存器、堆栈指针等,以及其它硬件的初始化;
3、完成硬件的初始化功能后,会通过一条跳转指令(或函数调用指令),跳转到Flash存储器的特定位置开始执行。
这个位置,一定是代码段(TEXT段)中的一个特定位置;
4、Flash中的代码,把DATA节从Flash中复制到RAM中;
5、完成DATA节的复制后,Flash中的代码会根据BSS节的大小,在RAM中预留相应的内存空间,作为未初始化变量使用;
6、上述功能完成之后,嵌入式系统执行的环境已经准备完毕,进入操作系统初始化阶段。
需要注意的是,对于DATA节的搬迁和BSS节的预留工作,也可能是由BootROM完成的,即BootROM中的硬件初始化代码执行完毕之后,会通过一些内存搬移指令,把Flash中的DATA节搬移到RAM中,然后再根据BSS节的大小,预留BSS空间,这些工作完成之后,就可通过一条跳转指令,跳转到TEXT节的某个位置(一般是操作系统的入口函数)开始执行。
这种情况下,需要BootROM中的代码,知道DATA节和BSS节的详细信息(大小、起始地址等)。
在这种加载方式下,所有的执行指令,都是从Flash中读取的,RAM中只是存放了数据和堆栈。
这种启动方式,可以节约物理内存空间,因为不需要专门为代码预留内存空间,因此一般应用在内存数量受到限制的系统中。
这种加载方式,有以下缺点:
1、由于代码直接在Flash中执行,一般情况下对Flash的访问,速度会比对RAM的访问要慢很多,因此性能会受到影响。
这个问题,若CPU本身携带了较大数量的代码cache,则会得到一定程度的缓和;
2、代码直接从Flash中运行,而一般情况下,Flash是只读的,因此无法实现代码的自我修改功能(即动态修改代码),这样不利于代码级的调试;
3、在对操作系统核心和应用程序代码进行编译的时候,必须指定TEXT节和DATA节、BSS节的起始地址,这个地址应该跟最终这些节在Flash和RAM中的位置相同。
因此,会给开发带来一定的困难。
总之,这种加载方式,在一些性能要求不是太关键、硬件配置受到限制的系统中,被大量的采用。
Internet发展初期的一些低端路由器,经常采用这种方式。
●加载方式之二:
从RAM运行代码
与上述方式“从Flash直接运行代码”不同的是,这种方式下,代码和数据都被加载到RAM中,从RAM中运行。
这样从Flash直接运行的一些弊端,就可以消除掉了。
这种方式下,加载过程如下(参考下图):
图2-3从RAM运行代码的加载方式
3、位于BootROM中的代码,把位于Flash中的操作系统和应用程序的TEXT节(代码节),从Flash中搬移到RAM中。
这个过程,需要BootROM内的搬移代码,预先知道TEXT节的起始地址和大小,这可以通过在操作系统映象的开始处(该位置往往是固定的),设置一个数据结构,来指明这些节的大小和起始位置,以及目标位置等。
这样在搬移的时候,BootROM中的代码,就可以先从这个固定位置,获得节的信息,然后再根据这些信息,来完成搬移工作;
4、与第三步类似,BootROM中的代码,把操作系统和应用程序映象的DATA节,搬移到RAM中;
5、BootROM中的启动代码,完成BSS节的RAM空间预留;
6、完成上述所有动作之后,BootROM中的代码通过一条跳转指令,跳转到RAM中操作系统的入口点,正式启动操作系统。
这种启动方式,是一种比较常见的启动方式,简便易行,而且克服了“直接从Flash中运行代码”的一些弊端。
但这种方式需要嵌入式系统配置较多的RAM存储器,因为操作系统和应用程序的代码,将直接在RAM中执行。
●启动方式之三:
从文件系统加载运行
在上面介绍的两种启动方式中,操作系统和应用程序的二进制映象,是存放在Flash当中的,而Flash直接映射到CPU的可寻址空间,因此在加载的时候,直接通过访存指令,就可以完成,无需额外的设备驱动程序。
但这种方式,需要系统配置较多的Flash存储器,这在操作系统映象很大的情况下,矛盾尤其突出。
而下面介绍的一种方式,是从外部存储器加载操作系统和应用程序映象的,可以解决该问题。
这种从文件系统加载操作系统映象的方式,与从Flash加载不同的是,操作系统映象和应用程序映象是存放在外部存储器(比如,IDE接口的硬盘)中的。
而对于外部存储器的访问所需要的驱动程序,则存放在BootROM中。
这种方式的加载过程,如下(可参考下图):
图2-4从文件系统加载系统的过程
3、BootROM中的引导代码,通过外部设备的驱动程序,读取外部存储器,把操作系统和应用程序的映象,加载到内存(RAM)中。
这个过程,可以不区分TEXT节和DATA节,而作为统一的二进制映象进行加载;
4、完成二进制映象的加载后,BootROM中的启动代码,需要进一步为操作系统预留BSS空间;
5、上述一切动作完成,操作系统运行的环境就绪后,BootROM中的代码通过一条转移指令(跳转或CALL),转移到操作系统的入口点,这样后续系统的运行,就完全在操作系统的控制下进行了。
这种加载方式,把操作系统和应用程序的映象都搬移到了外部存
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二章 Hello China的启动和初始化 第二 China 启动 初始化