ARM Linux启动过程分析_第1页
ARM Linux启动过程分析_第2页
ARM Linux启动过程分析_第3页
ARM Linux启动过程分析_第4页
ARM Linux启动过程分析_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ARM LLinuxx启动过程程分析赵楠 本章学学习目标: 了解Linnux结构构及平台属属性了解 boootlooaderr的相关知知识 熟悉并掌握握启动过程程摘 要: 从嵌入式式系统到超超级服务站站,嵌入式式 Linnux 的的可移植性性使得我们们可以在各各种电子产产品上看到到它的身影影。Linnux 是是一个完整整通用的UUnix 类分布式式操作系统统,它的结结构紧凑、功能强、效率高、可移植性性好且在IInterrnet 上可自由由取用。对于不同同体系结构构的处理器器来说Liinux的的启动过程程也有所不不同。本文文以S3CC24100 ARMM处理器为为例,详细细分析了系系统上电后后

2、boootloaader的的执行流程程及 ARRM Liinux的的启动过程程。关键词:AARM LLinuxx boootloaader 启动过程程Abstrract: froom thhe emmbeddded ssysteem too supper sserviice sstatiion, embeeddedd Linnux pportaabiliity aallowws uss to variious elecctronnic pproduucts in tthe fform of sseeinng itt. Liinux is aa commplette geeneraal Unni

3、x cclasss disstribbutedd opeeratiing ssysteem, iits struucturre coompacct, tthe ffuncttion is sstronng, hhigh effiicienncy, goodd porrtabiilityy andd in the Inteernett cann be freee to takee. Foor diifferrent systtem sstruccturee of the proccessoor iss thee staart oof thhe Liinux proccess is aalso d

4、iffferennt. BBasedd on the ARM proccessoor S33C24110 ass an exammple, thee papper aanalyyses systtem aafterr thee exeecutiion fflow of eelecttric boottloadder aand AARM LLinuxx staart-uup prrocesss.Keywoords: ARMM Linnux bbootlloadeer sttart-up pproceess1. 引 言 Linnux 最最初是由瑞瑞典赫尔辛辛基大学的的学生 LLinuss Torr

5、valdds在19991 年年开发出来来的,之后后在 GNNU的支持持下,Liinux 获得了巨巨大的发展展。虽然 Linuux 在桌桌面 PCC 机上的的普及程度度远不及微微软的 WWindoows 操操作系统,但但它的发展展速度之快快、用户数数量的日益益增多,也也是微软所所不能轻视视的。从嵌嵌入式系统统到超级服服务站,LLinuxx 已获得得广泛的应应用。Liinux 是一个完完整通用的的Unixx 类分布布式操作系系统,它的的结构紧凑凑、功能强强、效率高高、可移植植性好且在在Inteernett 上可自自由取用。Linuux 和UUnix 操作系统统一样,操操作系统的的主要功能能集中在内

6、内核,内核核中包含进进程管理、文件管理理、设备管管理和网络络管理等部部分。近些些年来 LLinuxx 在嵌入入式领域的的迅猛发展展,更是给给 Linnux 注注入了新的的活力。22.1 内内核结构及及平台相关关性 本本文以分析析的内核版版本为2.6.9。当我们使使用tarr 命令将将linuux-2.6.9.tar.bz2 解开时,内内核源代码码被放到了了linuux-2.6.9/目录中。Linuux 内核核各功能文文件分别存存放在liinux-2.6.9/ 目目录下的相相应子目录录中。Liinux 操作系统统可以工作作在多种不不同硬件平平台上,如如80 x886CPUU 系列(803886

7、以上上)、SUUN spparc664 和aarm266 等。为为了让Liinux 体现优良良的可移植植性,Liinux 内核代码码针对不同同的硬件平平台包含有有对应的启启动和初始始化程序。这些程序序处于arrch/子子目录中。用户完全全可以根据据自己的需需要,从内内核代码中中各取所需需,即时编编译和更换换系统内核核,这也是是Linuux 操作作系统获得得世界各地地网络爱好好者普遍支支持的主要要原因。鉴鉴于绝大部部分Linnux 应应用于Inntel 80 x886 系列列平台,所所以本文也也仅限对LLinuxx在80 xx86 系系列平台的的启动过程程进行分析析。本文所所要探讨的的启动程序序

8、位于arrch/ii386/boott/ 目录录,系统的的启动过程程主要由bbootssect.s、seetup.s 和hhead.s 等33 个汇编编程序完成成。其中 boottloadder是系系统启动或或复位以后后执行的第第一段代码码,它主要要用来初始始化处理器器及外设,然然后调用 Linuux 内核核。Linnux 内内核在完成成系统的初初始化之后后需要挂载载某个文件件系统做为为根文件系系统(Rooot FFilessysteem)。根根文件系统统是 Liinux 系统的核核心组成部部分,它可可以做为LLinuxx 系统中中文件和数数据的存储储区域,通通常它还包包括系统配配置文件和和运

9、行应用用软件所需需要的库。应用程序序可以说是是嵌入式系系统的“灵灵魂”,它它所实现的的功能通常常就是设计计该嵌入式式系统所要要达到的目目标。如果果没有应用用程序的支支持,任何何硬件上设设计精良的的嵌入式系系统都没有有实用意义义。 从以上上分析我们们可以看出出 boootloaader 和 Liinux 内核在嵌嵌入式系统统中的关系系和作用。Boottloadder在运运行过程中中虽然具有有初始化系系统和执行行用户输入入的命令等等作用,但但它最根本本的功能就就是为了启启动 Liinux 内核。在在嵌入式系系统开发的的过程中,很很大一部分分精力都是是花在boootlooaderr 和 LLinux

10、x 内核的的开发或移移植上。如如果能清楚楚的了解 boottloadder 执执行流程和和 Linnux的启启动过程,将将有助于明明确开发过过程中所需需的工作,从从而加速嵌嵌入式系统统的开发过过程。而这这正是本文文的所要研研究的内容容。3. Boootlooaderr3.1 BBootlloadeer的概念念和作用Bootlloadeer是嵌入入式系统的的引导加载载程序,它它是系统上上电后运行行的第一段段程序,其其作用类似似于 PCC 机上的的 BIOOS。在完完成对系统统的初始化化任务之后后,它会将将非易失性性存储器(通通常是 FFlashh或 DOOC 等)中中的Linnux 内内核拷贝到

11、到 RAMM 中去,然然后跳转到到内核的第第一条指令令处继续执执行,从而而启动 LLinuxx 内核。由此可见见,boootloaader 和 Liinux 内核有着着密不可分分的联系,要要想清楚的的了解 LLinuxx内核的启启动过程,我我们必须先先得认识 boottloadder的执执行过程,这这样才能对对嵌入式系系统的整个个启过程有有清晰的掌掌握。3.2 BBootlloadeer的执行行过程不同的处理理器上电或或复位后执执行的第一一条指令地地址并不相相同,对于于 ARMM 处理器器来说,该该地址为 0 x0000000000。对对于一般的的嵌入式系系统,通常常把 Fllash 等非易失

12、失性存储器器映射到这这个地址处处,而 bbootlloadeer就位于于该存储器器的最前端端,所以系系统上电或或复位后执执行的第一一段程序便便是 boootlooaderr。而因为为存储 bbootlloadeer的存储储器不同,bbootlloadeer的执行行过程也并并不相同,下下面将具体体分析。 嵌嵌入式系统统中广泛采采用的非易易失性存储储器通常是是 Flaash,而而 Flaash 又又分为 NNor FFlashh 和Naand FFlashh 两种。 它们之之间的不同同在于: Nor Flassh 支持持芯片内执执行(XIIP, eeXecuute IIn Pllace),这这样代

13、码可可以在Fllash上上直接执行行而不必拷拷贝到RAAM中去执执行。而NNand Flassh并不支支持XIPP,所以要要想执行 Nandd Flaash 上上的代码,必必须先将其其拷贝到 RAM中中去,然后后跳到 RRAM 中中去执行。实际应用用中的 bbootlloadeer根据所所需功能的的不同可以以设计得很很复杂,除除完成基本本的初始化化系统和调调用 Liinux 内核等基基本任务外外,还可以以执行很多多用户输入入的命令,比比如设置 Linuux 启动动参数,给给 Flaash 分分区等;也也可以设计计得很简单单,只完成成最基本的的功能。但但为了能达达到启动LLinuxx 内核的的目

14、的,所所有的 bbootlloadeer都必须须具备以下下功能 : 11.初始化化 RAMM因为 Liinux 内核一般般都会在 RAM 中运行,所所以在调用用 Linnux 内内核之前 boottloadder 必必须设置和和初始化 RAM,为为调用 LLinuxx内核做好好准备。初初始化 RRAM 的的任务包括括设置 CCPU 的的控制寄存存器参数,以以便能正常常使用 RRAM 以以及检测RRAM 大大小等。 22.初始化化串口串口在 LLinuxx 的启动动过程中有有着非常重重要的作用用,它是 Linuux内核和和用户交互互的方式之之一。Liinux 在启动过过程中可以以将信息通通过串口

15、输输出,这样样便可清楚楚的了解 Linuux 的启启动过程。虽然它并并不是 bbootlloadeer 必须须要完成的的工作,但但是通过串串口输出信信息是调试试 boootloaader 和Linnux 内内核的强有有力的工具具,所以一一般的 bbootlloadeer 都会会在执行过过程中初始始化一个串串口做为调调试端口。 3.检测处处理器类型型 Boottloadder在调调用 Liinux内内核前必须须检测系统统的处理器器类型,并并将其保存存到某个常常量中提供供给 Liinux 内核。LLinuxx 内核在在启动过程程中会根据据该处理器器类型调用用相应的初初始化程序序。 设置 Liinu

16、x启启动参数 BBootlloadeer在执行行过程中必必须设置和和初始化 Linuux 的内内核启动参参数。目前前传递启动动参数主要要采用两种种方式:即即通过 sstrucct paaram_struuct 和和struuct ttag(标标记列表,ttaggeed liist)两两种结构传传递。sttructt parram_sstrucct 是一一种比较老老的参数传传递方式,在在 2.44 版本以以前的内核核中使用较较多。从 2.4 版本以后后 Linnux 内内核基本上上采用标记记列表的方方式。但为为了保持和和以前版本本的兼容性性,它仍支支持 sttructt parram_sstru

17、cct 参数数传递方式式,只不过过在内核启启动过程中中它将被转转换成标记记列表方式式。标记列列表方式是是种比较新新的参数传传递方式,它它必须以 ATAGG_CORRE 开始始,并以AATAG_NONEE 结尾。中间可以以根据需要要加入其他他列表。LLinuxx内核在启启动过程中中会根据该该启动参数数进行相应应的初始化化工作。 55.调用 Linuux内核映映像 Boootloaader完完成的最后后一项工作作便是调用用 Linnux内核核。如果 Linuux 内核核存放在 Flassh 中,并并且可直接接在上面运运行(这里里的 Fllash 指 Noor Fllash),那那么可直接接跳转到内

18、内核中去执执行。但由由于在 FFlashh 中执行行代码会有有种种限制制,而且速速度也远不不及 RAAM 快,所所以一般的的嵌入式系系统都是将将 Linnux内核核拷贝到 RAM 中,然后后跳转到 RAM 中去执行行。不论哪哪种情况,在在跳到 LLinuxx 内核执执行之前 CUP的的寄存器必必须满足以以下条件:r000,r1处理器类类型,r22标记列列表在 RRAM中的的地址。启动过程分分析主要对boootseect.ss、settup.ss 和heead.ss 的工作作机理做了了较为详细细的阐述。4.1 bbootssect 模块分析析 bbootssect.s 代码码是磁盘引引导块程序序

19、,驻留在在引导盘的的引导扇区区(0 磁磁道,0 磁头,第第1 扇区区)。在PPC加电RROM BBIOS 自检后,bbootssect.s 由BBIOS 自动加载载到内存00 x7C000 处,然然后将自己己移到内存存0 x900000 处。图22 代码显显示了boootseect.ss 的移动动过程,其其中#BOOOTSEEG 为00 x7C000,#IINITSSEG 为为0 x90000。接接下来,程程序利用BBIOS中中断,INNT 0 xx13 将将setuup 模块块从磁盘第第2 个扇扇区开始读读到0 x9902000 开始处处,共读44 个扇区区。如果读读出错误,则则CF标志志置

20、位,程程序复位驱驱动器,并并重试。加加载settup 模模块后,程程序利用中中断取磁盘盘驱动器参参数,并将将中断返回回的每磁道道扇区数保保存在变量量secttors 中。然后后程序将ssysteem 模块块加载到内内存0 x1100000 处。加加载sysstem 模块期间间,显示“Loadding systtem”信息。为为了提高加加载速度,只只要可能,就就每次加载载整条磁道道的数据。从磁盘读读取一次数数据后,程程序就比较较当前所读读段是否就就是系统数数据末端所所处的段(#ENDDSEG),如果不不是,就跳跳转至okk1_reead 标标号处继续续读数据。最后,程程序向软驱驱控制卡的的驱动端

21、口口0 x3ff2 写00,关闭软软驱电动机机。程序运运行jmppi 0,SSETUPPSEG,跳跳转到0 xx90200:00000 处,CCPU开始始执行seetup 模块。 图2 boottsectt 移动代代码4.2 setuup 模块块分析 ssetupp.s首先先利用ROOMBIOOS中断读读取机器系系统参数(光标位置置、扩展内内存数、硬硬盘参数表表等),并并将这些数数据保存到到内存0 xx900000 开始始的位置(覆盖掉了了boottsectt 程序)。这些参参数将被内内核中相关关程序使用用,例如设设备驱动程程序集中的的ttyiio.c。随后系统统进入保护护模式运行行。CPUU

22、 在实模模式下运行行,寻址一一个内存地地址主要是是使用段基基址和段内内偏移值,段段值被存放放在段寄存存器中;而而在保护模模式运行方方式下,段段寄存器中中存放的是是一个描述述表中某项项的索引值值。索引值值指定的描描述符项中中含有需要要寻址的内内存段的基基地址、段段的最大长长度值和段段的访问级级别等信息息。和实模模式下的寻寻址相比,段段寄存器值值换成了段段描述符项项索引。接接下来,程程序关闭中中断,将ssysteem模块整整体向内存存低端移动动0 x10000。每每次移动00 x80000 字,循循环执行88 次。然然后程序执执行liddt iddt_488 加载中中断描述符符表(iddt)寄存存

23、器;执行行lgdtt gdtt_48 加载全局局描述符表表(gdtt)寄存器器。此时中中断描述符符表中只有有一个空项项(值全为为0)。全全局描述符符表中有33 个描述述符项:第第1 项无无用,但必必须存在;第2 项项(索引值值0 x088)是系统统代码段描描述符,所所定义的段段基址为00,段中代代码可被读读和执行,段段长为8 M;第33项(索引引值0 x110) 是是系统数据据段描述符符,所定义义的段的基基址为0,段段中数据可可读和可写写,段限长长为8M。最后,程程序重置协协处理器,对对82599 中断控控制芯片编编程,完成成进入保护护虚地址模模式的所有有准备工作作。通过设设置机器状状态字MSSW(第00 号控制制寄存器CCR0 的的低16 位)中的的PE 位位使CPUU进入保护护模式,开开始运行ssysteem模块中中的heaad.s(指令jmmpi 00,8)。注意,CCPU 已已在保护模模式下运行行,CS 置8 表表示请求特特权级0,使使用全局描描述符表中中的第1 项(索引引值0 x008)。图图3 显示示了settup.ss 结束后后内存分布布。 图图3 seet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论