欢迎来到天天文库
浏览记录
ID:42001817
大小:309.51 KB
页数:23页
时间:2019-09-06
《嵌入式Linux启动流程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第16章嵌入式Linux启动流程在多数计算机上,从Linux开机到进入系统的命令行或者图形界面时间并不长。计算机在背后做了什么工作,会展现出一个功能强大的系统,本章分析Linux系统启动流程。学习和掌握Linux启动的流程对了解Linux内核工作流程有很大帮助。Linux系统初始化可以分成两大部分:内核初始化和系统初始化。本章分析从打开电源开关到进入用户界面Linux系统的工作,主要内容如下:Linux内核初始化概览进入内核前的工作内核初始化如何进入用户空间16.1Linux内核初始化流程从前面讲解的知
2、识知道,操作系统是用户应用和计算机硬件之间的桥梁。操作系统管理整个系统的所有软硬件资源,并且向用户应用程序提供接口。在操作系统初始化的时候,系统内核检测计算机硬件,加载驱动并且设置软件环境,本节详细讲解Linux内核初始化所做的工作。16.2PC机的初始化流程先给出一个PC机的初始化流程图。16.2.1PC机BIOS功能和作用图16-3是PC机BIOS的功能结构。16.2.2硬盘的数据结构PC机最常见的外部存储设备是硬盘驱动器。硬盘可以存储大量的数据,并且具有断电信息不丢失的特点。硬盘上的数据组织格式随
3、不同操作系统不完全相同。无论什么系统,对硬盘的数据组织方式有何不同,都包含了一个引导记录的数据结构。引导记录(英文全称MainBootRecord,简称MBR)是位于硬盘0磁道0柱面的第一个扇区。一个扇区有512字节,MBR占用了开始的446字节。16.2.2硬盘的数据结构16.2.3完整的初始化流程在弄清楚PC机BIOS和硬盘引导程序的结构和作用后,说一下PC机的启动流程。PC机加电或者Reset后硬件系统会复位,复位后寄存器CS=0xFFFF,寄存器IP=0x0000。CPU从FFFF:0000H处
4、执行指令,这个地址只有一条JMP(跳转)指令,跳转到系统自检程序,也就是进入了BIOS程序存放的位置。执行自检程序通过后,BIOS根据配置把软盘或者硬盘(光盘也是同样道理)的MBR扇区读入系统0000:7C00H处,执行MBR的代码。MBR的代码通常由操作系统修改,也可以由其他程序(例如GRUB引导器)修改。如果机器安装了GRUB引导软件,执行MBR的代码会启动GRUB引导软件。系统的控制权交由GRUB引导软件处理,GRUB根据分区的配置信息,找到硬盘对应分区上Linux内核文件并且加载到内存,然后跳转
5、到内核代码位置,最后把系统控制权交给Linux内核。16.3嵌入式系统的初始化嵌入式系统的多样性和复杂性,一般不像PC机那样配置BIOS,系统中也没有像BIOS那样的固件。用于启动的代码必须由用户完成,通常称这部分代码为Bootloader程序,整个系统的启动就由它完成。Bootloader初始化硬件设备、建立内存空间的映射,将系统的软硬件环境设定在一个合适的状态,为加载操作系统内核和应用程序准备一个正确的环境。Bootloader依赖实际硬件环境,通常不存在一个通用的标准。对于不同的嵌入式系统,Boo
6、tloader程序内容也不相同。本书以ARM处理器为例介绍嵌入式系统的初始化。16.3嵌入式系统的初始化16.4Linux内核初始化Linux内核在不同处理器体系结构上启动代码不全相同,但是启动的流程基本一致,本书根据嵌入式开发的需要从ARM核分析Linux内核初始化过程。16.4.1解压缩内核映像对于大多数嵌入式应用,由于存储器空间的限制,大多数编译后的内核映像都是压缩存放,所以进入内核的第一步首先是解压缩内核映像。16.4.2进入内核代码接下来就进入了真正的内核代码。在有MMU的处理器上,系统会使用
7、虚拟地址,通过MMU指向实际物理地址。16.5启动init内核进程在start_kernel()函数最后调用了rest_init()函数,此函数用来创建内核init进程,这也是内核态的最后的工作。代码如下:staticvoidrest_init(void){kernel_thread(init,NULL,CLONE_FS
8、CLONE_FILES
9、CLONE_SIGNAL);unlock_kernel();current->need_resched=1;cpu_idle();}16.6根文件系统初始化Li
10、nux内核启动完毕后,首先就是要创建根文件系统,用户空间所有的操作都依赖根文件系统。本节介绍根文件系统的结构,并结合代码分析根文件系统的初始化过程。16.6.1根文件系统介绍在内核代码启动完之后,进入文件系统初始化的阶段,Linux需要加载根文件系统。Linux的根文件系统可以分两类:虚拟根文件系统和真实根文件系统。Linux内核的发展趋势是把更多的功能放在用户空间完成,可以保持内核的精简。虚拟根文件系统也是各Linux发行厂商采用的一种方
此文档下载收益归作者所有