计算机系统的启动是一个复杂的过程,启动过程大致可以分为以下几个阶段:
+------计算机系统启动流程----------------------------- --------------------+ |+-------1----------+ +-------2-----------+ +-------3---------+| || | | | | || || 管理控制单元上电 |----->| cpu上电 |---->| BIOS引导 || || | | | | || |+------------------+ +-------------------+ +-------+---------+| | | | | +-------<-------------------------<--------------+ | | | | | | | |+-------4--+-------+ +-------5-----------+ +-------6---------+| || | | | | || || 加载OS内核 |----->| 系统软硬件初始化 |---->| 启动init进程 || || | | | | || |+------------------+ +-------------------+ +-----------------+| +-----------------------------------------------------------------------+
其中最开始的2个阶段是属于机械物理过程,最后2个阶段主要是按照一定的顺序来执行软件程序,这几个阶段都较为直观简单,中间的2个阶段从BIOS开始到系统执行内核启动函数start_kernel()结束。
那么先来说说bios,计算机基本输入输出系统,通俗点讲是保存在ROM的一组程序,计算机系统上电后cpu执行的第一个程序就是bios程序,这里有一个问题:
在系统上电的一瞬间,内存、cpu相关的一些寄存器都是空白的,bios程序是如何开始执行的呢?
从系统体系的角度看,既然bios不能由软件来触发执行,那么只能由硬件逻辑来实现。Intel 80x86
系列的cpu分为实模式和保护模式,实际上是,在cpu上电的一瞬间即进入实模式运行,同时硬件逻辑将cpu的cs寄存器和ip寄存器设置为:0xFFFF-0x0000,计算机体系将bios程序的入口写死在这个地址上,同时cpu在实模式下的地址即为绝对地址,cpu根据cs+ip找到了bios程序的入口的物理地址,load第一条bios指令到cpu开始执行。bios程序主要干两件事情:硬件检测和配置、加载os
的内核。注意bios程序是不会直接去加载os 内核的,那么:
bios程序为什么不直接加载os 内核, os内核是由谁来加载的呢?