linux启动过程

Linux启动过程对于初学者而言有点扑朔迷离,这是因为启动过程关乎处理器配置、内存配置、外 围硬件配置,而不同的处理器和硬件系统会釆用不同的策略,从而具体的启动过程会有所差异。但无论差异如何,从计算机系统的角度来看,启动过程一般分为三个步骤,如 图 1-1所示。

在这里插入图片描述
图 1 - 1 通用系统的启动过程
首先是开机,开机就是给系统开始供电,此时硬件电路会产生一个确定的复位时序,保 证 CPU是
最后一个被复位的器件。为什么CPU要最后被复位呢?因为,如 果 CPU第一个被复位,则 当 CPU复
位后开始运行时,其他硬件内部的寄存器状态可能还没有准备好,比如磁盘或者内存,那么就可能出现
外围硬件初始化错误。
当正确完成复位后,CPU开始执行第一条指令,该指令所在的内存地址是固定的,这 由 CPU的制
造者指定。不同的CPU可能会从不同的地址获取指令,但这个地址必须是固定的,这个固定地址所保
存的程序往往被称为“引导程序” Bootloader),因为其作用是装载真正的用户程序。
至于如何装载,则是一个策略问题,不同的CPU会提供不同的装载方式,比如有的是通过普通的
并口存储器,有的则是通过SD卡,还有的是通过RS232接口。无论硬件上使用何种接口装载,装载过
程必须提供以下信息,具体包括:
• 从哪里读取用户程序?
• 用户程序的长度是多少?
• 装载完用户程序后,应该跳转到哪里,即用户程序的执行入口在哪里?
不同硬件系统会釆用不同的策略,但只要以上三个信息是确定的,用户程序就会被装载到确定的地
址,并执行相同的操作。

	第二步是执行内核程序,这里所说的内核程序在上一步中指的就是“用户程序”。因为从CPU的角 

度来看,除 Bootloader之外的所有的程序都是用户程序,只是从软件的角度来看,用户程序被分为“内
核程序” 和 “应用程序”,而本步执行的是“ 内核程序”。
内核程序初始化时执行的操作包括,初始化各种硬件,包括内存、网络接口、显示器、输入设备,
然后建立各种内部数据结构,这些数据结构将用于多线程调度及内存的管理等。当内核初始化完毕后,
就开始运行具体的应用程序了。在一般情况下,习惯于将第一个应用程序称为“Home程序”。
第二步就是运彳丁 Home程序,比如Windows系统的桌面,就是一1个典型的Home程序。之所以称
其 为 Home程序,是因为通过该程序可以方便地启动其他应用程序。而传统的Linux系统启动后,第一
个运行程序一般是一个Terminal,尽管它表面上就像一个Dos界面,但它也可以被称为Home程序,因
为 Home程序设计的目标就是提供一个入口,用户可以通过该入口启动其他应用程序。
以上从通用操作系统的角度介绍了启动过程,接下来,具体来看Android所使用的Linux内核的启
动过程。因为目前的Android系统多运行在ARM 处理器之上,因此,下面主要分析运行于ARM 处理
器上的Linux的启动过程。在介绍之前,先来简单区分三个概念:ARM、处理器、CPU。
ARM本身是一个公司的名称,从技术的角度来看,它又是一种微处理器内核的架构。
处理器是一种统称,可以指具体的CPU芯片,比如Intel 8086处理器,苹果的A8处理器等。处理
器内部一般包含CPU、片上内存、片上外设接口等不同的硬件逻辑。
CPU是处理器内部的中央处理单元的缩写,CPU可以按照类型分为短指令集架构和长指令集架构
两大类,ARM属于短指令集架构的一种。
对 于 ARM 处理器,当复位完毕后,处理器首先执行其片上RO M 中的一小块程序。这 块 ROM 的
大小一般只有几KB,该段程序就是Bootloader程序,这段程序执行时会根据处理器上一些特定引脚的
高低电平状态,选择从何种物理接口上装载用户程序,比如USB 口、串口、SD卡、并口 Flash等。
多数基于ARM 的实际硬件系统,会从并口 NAND Flash芯片中的0x00000000地址处装载程序。
对于一些小型嵌入式系统而言,该地址中的程序就是最终要执行的用户程序;而对于Android而言,该
地址中的程序还不是Android程序,而是一个叫做uboot或 者 fastboot的程序,其作用是初始化硬件设
备,比如网口、SDRAM、RS232等,并提供一些调试功能,比如向NAND Flash中写入新的数据,这
可用于开发过程中的内核烧写、升级等。
当 uboot (fastboot)被装载后便开始运行,它一般会先检测用户是否按下了某些特别按键,这些特
别按键是uboot在编译时预先约定好的,用于进入调试模式。如果用户没有按这些特别的按键,则 uboot
会从NAND Flash中装载Linux内核,装载的地址是在编译uboot时预先约定好的。
Linux内核被装载后,就开始进行内核初始化的过程,该过程如表1-2所示。
表 1-2 Linux内核的启动步骤
在这里插入图片描述
linux启动过程_第1张图片
以上过程中,initrc文件在Android手机中的系统根目录下,可以使用adb pull命令提取出该文件: ./adb pull /init.rc 〜/De sktop
initrc的内容格式类似于一种脚本,但是它却不是标准的Linux脚本,而是仅用于启动的脚本。关
于 init.rc的完整格式请参考Linux相关文档。

你可能感兴趣的:(linux学习)