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

下载本文档

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

文档简介

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

2、执行流程程及 ARMM Linuux的启动过过程。关键词:ARMM Linuux boootloadder 启动动过程Abstracct: frrom thhe embbeddedd systtem too supeer serrvice statiion, eembeddded Liinux pportabbilityy alloows uss to vvariouus eleectronnic prroductts in the fform oof seeeing iit. Liinux iis a ccompleete geenerall Unixx classs disstribuut

3、ed ooperatting ssystemm, its strructurre commpact, the functtion iis strrong, high efficciencyy, goood porrtabillity aand inn the Interrnet ccan bee freee to ttake. For ddifferrent ssystemm struucturee of tthe prrocesssor iss the startt of tthe Liinux pprocesss is also diffeerent. Baseed on the AARM

4、 prrocesssor S33C24100 as aan exaample, the paperr anallyses systeem aftter thhe exeecutioon floow of electtric bbootlooader and AARM Liinux sstart-up prrocesss.Keywordds: ARRM Linnux boootloaader sstart-up prrocesss1. 引 言 Liinux 最最初是由瑞典典赫尔辛基大大学的学生 Linuss Torvvalds在在1991 年开发出来来的,之后在在 GNU的的支持下,LLinux

5、 获得了巨大大的发展。虽虽然 Linnux 在桌桌面 PC 机上的普及及程度远不及及微软的 WWindowws 操作系系统,但它的的发展速度之之快、用户数数量的日益增增多,也是微微软所不能轻轻视的。从嵌嵌入式系统到到超级服务站站,Linuux 已获得得广泛的应用用。Linuux 是一个个完整通用的的Unix 类分布式操操作系统,它它的结构紧凑凑、功能强、效效率高、可移移植性好且在在Interrnet 上上可自由取用用。Linuux 和Unnix 操作作系统一样,操操作系统的主主要功能集中中在内核,内内核中包含进进程管理、文文件管理、设设备管理和网网络管理等部部分。近些年年来 Linnux 在嵌

6、嵌入式领域的的迅猛发展,更更是给 Liinux 注注入了新的活活力。2.1 内核核结构及平台台相关性 本文以以分析的内核核版本为2.6.9。当当我们使用ttar 命令令将linuux-2.66.9.taar.bz22 解开时,内内核源代码被被放到了liinux-22.6.9/目录中。LLinux 内核各功能能文件分别存存放在linnux-2.6.9/ 目录下的相相应子目录中中。Linuux 操作系系统可以工作作在多种不同同硬件平台上上,如80 xx86CPUU 系列(880386 以上)、SSUN spparc644 和armm26 等。为为了让Linnux 体现现优良的可移移植性,Liinu

7、x 内内核代码针对对不同的硬件件平台包含有有对应的启动动和初始化程程序。这些程程序处于arrch/子目目录中。用户户完全可以根根据自己的需需要,从内核核代码中各取取所需,即时时编译和更换换系统内核,这这也是Linnux 操作作系统获得世世界各地网络络爱好者普遍遍支持的主要要原因。鉴于于绝大部分LLinux 应用于Inntel 880 x86 系列平台,所所以本文也仅仅限对Linnux在800 x86 系系列平台的启启动过程进行行分析。本文文所要探讨的的启动程序位位于archh/i3866/boott/ 目录,系系统的启动过过程主要由bbootseect.s、ssetup.s 和heead.s

8、等3 个汇汇编程序完成成。其中 bbootlooader是是系统启动或或复位以后执执行的第一段段代码,它主主要用来初始始化处理器及及外设,然后后调用 Liinux 内内核。Linnux 内核核在完成系统统的初始化之之后需要挂载载某个文件系系统做为根文文件系统(RRoot FFilesyystem)。根根文件系统是是 Linuux 系统的的核心组成部部分,它可以以做为Linnux 系统统中文件和数数据的存储区区域,通常它它还包括系统统配置文件和和运行应用软软件所需要的的库。应用程程序可以说是是嵌入式系统统的“灵魂”,它它所实现的功功能通常就是是设计该嵌入入式系统所要要达到的目标标。如果没有有应用

9、程序的的支持,任何何硬件上设计计精良的嵌入入式系统都没没有实用意义义。 从以上分析析我们可以看看出 boootloadder 和 Linuxx 内核在嵌嵌入式系统中中的关系和作作用。Boootloadder在运行行过程中虽然然具有初始化化系统和执行行用户输入的的命令等作用用,但它最根根本的功能就就是为了启动动 Linuux 内核。在在嵌入式系统统开发的过程程中,很大一一部分精力都都是花在boootloaader 和和 Linuux 内核的的开发或移植植上。如果能能清楚的了解解 boottloadeer 执行流流程和 Liinux的启启动过程,将将有助于明确确开发过程中中所需的工作作,从而加速速

10、嵌入式系统统的开发过程程。而这正是是本文的所要要研究的内容容。3. Boootloadder3.1 Boootloaader的概概念和作用Bootloaader是嵌嵌入式系统的的引导加载程程序,它是系系统上电后运运行的第一段段程序,其作作用类似于 PC 机上上的 BIOOS。在完成成对系统的初初始化任务之之后,它会将将非易失性存存储器(通常常是 Flaash或 DDOC 等)中中的Linuux 内核拷拷贝到 RAAM 中去,然然后跳转到内内核的第一条条指令处继续续执行,从而而启动 Liinux 内内核。由此可可见,boootloadder 和 Linuxx 内核有着着密不可分的的联系,要想想清

11、楚的了解解 Linuux内核的启启动过程,我我们必须先得得认识 boootloaader的执执行过程,这这样才能对嵌嵌入式系统的的整个启过程程有清晰的掌掌握。3.2 Boootloaader的执执行过程不同的处理器上上电或复位后后执行的第一一条指令地址址并不相同,对对于 ARMM 处理器来来说,该地址址为 0 x0000000000。对于于一般的嵌入入式系统,通通常把 Fllash 等等非易失性存存储器映射到到这个地址处处,而 boootloaader就位位于该存储器器的最前端,所所以系统上电电或复位后执执行的第一段段程序便是 bootlloaderr。而因为存存储 boootloadder的

12、存储储器不同,bbootlooader的的执行过程也也并不相同,下下面将具体分分析。 嵌入式系系统中广泛采采用的非易失失性存储器通通常是 Fllash,而而 Flassh 又分为为 Nor Flashh 和Nannd Flaash 两种种。 它们之之间的不同在在于: Noor Flaash 支持持芯片内执行行(XIP, eXecuute Inn Placce),这样样代码可以在在Flashh上直接执行行而不必拷贝贝到RAM中中去执行。而而Nand Flashh并不支持XXIP,所以以要想执行 Nand Flashh 上的代码码,必须先将将其拷贝到 RAM中去去,然后跳到到 RAM 中去执行。实

13、实际应用中的的 boottloadeer根据所需需功能的不同同可以设计得得很复杂,除除完成基本的的初始化系统统和调用 LLinux 内核等基本本任务外,还还可以执行很很多用户输入入的命令,比比如设置 LLinux 启动参数,给给 Flassh 分区等等;也可以设设计得很简单单,只完成最最基本的功能能。但为了能能达到启动LLinux 内核的目的的,所有的 bootlloaderr都必须具备备以下功能 : 1.初初始化 RAAM因为 Linuux 内核一一般都会在 RAM 中中运行,所以以在调用 LLinux 内核之前 bootlloaderr 必须设置置和初始化 RAM,为为调用 Liinux内

14、核核做好准备。初初始化 RAAM 的任务务包括设置 CPU 的的控制寄存器器参数,以便便能正常使用用 RAM 以及检测RRAM 大小小等。 2.初始化串串口串口在 Linnux 的启启动过程中有有着非常重要要的作用,它它是 Linnux内核和和用户交互的的方式之一。LLinux 在启动过程程中可以将信信息通过串口口输出,这样样便可清楚的的了解 Liinux 的的启动过程。虽虽然它并不是是 boottloadeer 必须要要完成的工作作,但是通过过串口输出信信息是调试 bootlloaderr 和Linnux 内核核的强有力的的工具,所以以一般的 bbootlooader 都会在执行行过程中初始

15、始化一个串口口做为调试端端口。 3.检测处理理器类型 Boootloadder在调用用 Linuux内核前必必须检测系统统的处理器类类型,并将其其保存到某个个常量中提供供给 Linnux 内核核。Linuux 内核在在启动过程中中会根据该处处理器类型调调用相应的初初始化程序。 设置 Linuux启动参数数 Boootloaader在执执行过程中必必须设置和初初始化 Liinux 的的内核启动参参数。目前传传递启动参数数主要采用两两种方式:即即通过 sttruct paramm_struuct 和sstructt tag(标标记列表,ttaggedd listt)两种结构构传递。sttruct

16、paramm_struuct 是一一种比较老的的参数传递方方式,在 22.4 版本本以前的内核核中使用较多多。从 2.4 版本以以后 Linnux 内核核基本上采用用标记列表的的方式。但为为了保持和以以前版本的兼兼容性,它仍仍支持 sttruct paramm_struuct 参数数传递方式,只只不过在内核核启动过程中中它将被转换换成标记列表表方式。标记记列表方式是是种比较新的的参数传递方方式,它必须须以 ATAAG_CORRE 开始,并并以ATAGG_NONEE 结尾。中中间可以根据据需要加入其其他列表。LLinux内内核在启动过过程中会根据据该启动参数数进行相应的的初始化工作作。 5.调调

17、用 Linnux内核映映像 Bootlloaderr完成的最后后一项工作便便是调用 LLinux内内核。如果 Linuxx 内核存放放在 Flaash 中,并并且可直接在在上面运行(这这里的 Fllash 指指 Nor Flashh),那么可可直接跳转到到内核中去执执行。但由于于在 Flaash 中执执行代码会有有种种限制,而而且速度也远远不及 RAAM 快,所所以一般的嵌嵌入式系统都都是将 Liinux内核核拷贝到 RRAM 中,然然后跳转到 RAM 中中去执行。不不论哪种情况况,在跳到 Linuxx 内核执行行之前 CUUP的寄存器器必须满足以以下条件:rr00,rr1处理器器类型,r22

18、标记列表表在 RAMM中的地址。启动过程分析主要对boottsect.s、settup.s 和headd.s 的工工作机理做了了较为详细的的阐述。4.1 boootsectt 模块分析析 boootsectt.s 代码码是磁盘引导导块程序,驻驻留在引导盘盘的引导扇区区(0 磁道道,0 磁头头,第1 扇扇区)。在PPC加电ROOM BIOOS 自检后后,boottsect.s 由BIIOS 自动动加载到内存存0 x7C000 处,然然后将自己移移到内存0 xx900000 处。图22 代码显示示了boottsect.s 的移动动过程,其中中#BOOTTSEG 为为0 x7C000,#INNITS

19、EGG 为0 x99000。接接下来,程序序利用BIOOS中断,IINT 0 xx13 将ssetup 模块从磁盘盘第2 个扇扇区开始读到到0 x902200 开始始处,共读44 个扇区。如如果读出错误误,则CF标标志置位,程程序复位驱动动器,并重试试。加载seetup 模模块后,程序序利用中断取取磁盘驱动器器参数,并将将中断返回的的每磁道扇区区数保存在变变量secttors 中中。然后程序序将systtem 模块块加载到内存存0 x100000 处。加加载systtem 模块块期间,显示示“Loadiing syystem”信息。为为了提高加载载速度,只要要可能,就每每次加载整条条磁道的数据

20、据。从磁盘读读取一次数据据后,程序就就比较当前所所读段是否就就是系统数据据末端所处的的段(#ENNDSEG),如果不是是,就跳转至至ok1_rread 标标号处继续读读数据。最后后,程序向软软驱控制卡的的驱动端口00 x3f2 写0,关闭闭软驱电动机机。程序运行行jmpi 0,SETTUPSEGG,跳转到00 x90200:00000 处,CPPU开始执行行setupp 模块。 图图2 boootsectt 移动代码码4.2 seetup 模模块分析 settup.s首首先利用ROOMBIOSS中断读取机机器系统参数数(光标位置置、扩展内存存数、硬盘参参数表等),并并将这些数据据保存到内存存0

21、 x900000 开始始的位置(覆覆盖掉了boootsecct 程序)。这些参数数将被内核中中相关程序使使用,例如设设备驱动程序序集中的tttyio.cc。随后系统统进入保护模模式运行。CCPU 在实实模式下运行行,寻址一个个内存地址主主要是使用段段基址和段内内偏移值,段段值被存放在在段寄存器中中;而在保护护模式运行方方式下,段寄寄存器中存放放的是一个描描述表中某项项的索引值。索索引值指定的的描述符项中中含有需要寻寻址的内存段段的基地址、段段的最大长度度值和段的访访问级别等信信息。和实模模式下的寻址址相比,段寄寄存器值换成成了段描述符符项索引。接接下来,程序序关闭中断,将将systeem模块整

22、体体向内存低端端移动0 x11000。每每次移动0 xx8000 字,循环执执行8 次。然然后程序执行行lidt idt_448 加载中中断描述符表表(idt)寄存器;执执行lgdtt gdt_48 加载载全局描述符符表(gdtt)寄存器。此此时中断描述述符表中只有有一个空项(值全为0)。全局描述述符表中有33 个描述符符项:第1 项无用,但但必须存在;第2 项(索引值0 xx08)是系系统代码段描描述符,所定定义的段基址址为0,段中中代码可被读读和执行,段段长为8 MM;第3项(索引值0 xx10) 是是系统数据段段描述符,所所定义的段的的基址为0,段段中数据可读读和可写,段段限长为8MM。最后,程程序重置协处处理器,对88259 中中断控制芯片片编程,完成成进入保护虚虚地址模式的的所有准备工工作。通过设设置机器状态态字MSW(第0 号控控制寄存器CCR0 的低低16 位)中的PE 位使CPUU进入保护模模式,开始运运行systtem模块中中的headd.s(指令令jmpi 0,8)。注注意,CPUU 已在保护护模式下运行行,CS 置置8 表示请请求特权级00,使用全局局描述符表中中的第1 项项(索引值00 x08)。图图3 显示了了setupp.s 结束束后内存分布布。 图图3

温馨提示

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

评论

0/150

提交评论