现在的位置: 首页 > 综合 > 正文

Linux基础(二):计算机启动流程

2013年09月07日 ⁄ 综合 ⁄ 共 2318字 ⁄ 字号 评论关闭

讲到计算机的启动流程,我们要先明白这么一件事,内存是挥发性存储器件,所以在计算机上电之前内存中是什么都不存在的,所以从内存中的程序和数据从无到有,这需要一个过程,就是我们要讲的计算机启动流程。

知识预热:(以下数据来自于百度百科)

1、BIOS、CMOS

   (1)BIOS是一个写入到硬件上的一个软件程序,BIOS的功能主要分为3部分:自检和初始化程序服务处理硬件中断处理

        a)自检和初始化

            这个功能又分为3部分:

           i、加电自检(POST power on self test),上电后对计算机的硬件部分检测,通常要检测的硬件有:CPU,640K基本内存,1M以上的扩展内存,ROM,主板,CMOS存储器,串并口,显示卡,软硬盘子系统及键盘进行测试。

           ii、初始化,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测

         
 
iii、引导程序,作用是引导DOS或其他操作系统,BIOS先从硬板的起始扇区中读取引导记录,读取成功后,BIOS会把控制权交给引导记录,由引导记录把操作系统装入电脑

        b)程序服务处理,服务对象是用户的应用程序和操作系统,提供的服务是与I/O设备有关的服务,如:读磁盘、文件输出到打印机

       c)硬件中断处理处理应用程序和操作系统对硬件的需求,如磁盘和串口服务、视频服务、屏幕打印

   (2)CMOS主要用于存储BIOS设置程序所设置的一些参数和数据

2、MBR

字节偏移(hex) 字节数 描述
00~1BD 446 引导代码
1BE~1CD 16 分区表项1
1CE~1DD 16 分区表项2
1DE~1ED 16 分区表项3
1EE~1FD 16 分区表项4
1FE~1FF 2 55AA


注:进制转换程序可以在我的博客分类“工具箱”中找到。

1BD = 1*16*16 + 11(B)*16 + 13 = 445

1BE~1FD = 446~509,共64bytes

    (1)MBR(master boot record 主引导记录)位于硬盘的0号柱面、0号磁头、1号扇区(PS. 硬盘的0\0\0用于存放本磁盘的型号,大小等内容),主要由4个部分组成。

       
 i、主引导程序:0000H~0088H,它负责从活动分区中装载运行系统的引导程序。这里主要包含一段指令,用于通知计算机如何阅读分区表并定位操作系统的位置,这部分的代码会因操作系统的不同而不同,利用引导代码可以实现多重引导。

         ii、出错信息数据区偏移地址0x89--0xE1为出错信息,0xE2--0x1BD全为0字节。

         iii、分区表,0x1BE~0x1FD,每个分区表项占16bytes最多可以描述4个分区(这就是为什么MBR分区体系只能分成4个区【我们平时看到的分区一般可以从26个字母中选取任意多个当做分区标识(多于4个),这是因为那些分区是逻辑分区,这里的4个分区指的是主分区和扩展分区的数目,而逻辑分区是在扩展分区中划分出来的,也叫做二级、三级扩展分区。】)。含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,

     分区表项并没有顺序要求,即不要求第一个分区表项在第二个分区表项前。分区表也不要求从第一个分区表项开始
     iv、结束标志,偏移地址01FE--01FF的2个字节值为结束标志55AA,如果没有这个标志,操作系统会认为磁盘没有初始化,无法正确加载磁盘的分区。 
 
       
  PS. 在嵌入式的世界,我们用的就是大名鼎鼎的Bootloader来代替PC机上MBR的作用。 
         BootLoader 的启动过程可分为:单阶段和多阶段两种,实际应用中多阶段功能强大,可移植性好所以多采用多阶段。
         目前Bootloader大多采用两阶段,即启动过程可以分为  stage1  和  stage2:
              stage1(用汇编实现,且在Flash上运行,因为C语言的实现需要库的支持,显然刚开机的时候库还没有准备好):
                     (1)硬件初始化(主要是CPU内部的寄存器)
                     (2)为 BootLoader 的stage2阶段准备内存(ram)空间
                     (3)将BootLoader的stage2阶段的代码拷贝到内存空间
                     (4)设置好堆栈(设置堆栈的原因是,在stage2阶段要用到 C 代码,C代码的运行要用到堆栈)
                     (5)跳转到  stage2 的C入口点
              stage2(用C语言实现,在内存中运行):
                     (1)初始化一些板载的一些硬件
                     (2)将内核和根文件系统从flash中拷贝到内存中
                     (3)调用内核,启动操作系统

MBR截图:


=====================================================================================================================

     上面的知识预热搞定后,那么搞定系统的启动流程就很简单了,

     首先,计算机上电后,

     (1)先启动的是主板上的BIOS,BIOS完成硬件检测、资源分配、初始化一些寄存器和向量,(这里假设BIOS检测到的第一个可以启动的装置是硬盘)最后BIOS会把硬盘的CHS=0\0\1处的扇区即MBR读入内存0x7c00位置,并把控制权移交给MBR中的主引导程序

     (2)MBR中的主引导程序根据分区表会把操作系统的内核镜像从硬盘中读到内存中去,并把控制权交给操作系统

     (3)操作系统启动

抱歉!评论已关闭.