From Linux 0.0.1内核分析和操作系统设计 Chapter5
========================================================
Title: IA32 System Boot Process
Key: System Boot
Tools in Experiment:NONE
Reference:Linux 0.0.1内核分析和操作系统设计
========================================================
IA32架构的系统引导简介:
  • 硬盘启动步骤
a)系统加电;
b)BIOS加电自检 - 从物理地址的0xFFFF:0000处开始执行,这是BIOS的起始地址。主要是对系统关键设备如CPU、内存及硬盘等关键设备检测并根据检测结果更新ESCD(Extended System Configuration Data,扩展系统配置数据)。
c)将硬盘主引导区的512个字节读入到内存 0x0000:7C00,并跳到0x0000:7C00处开始执行。
e)检查 0x0000:7DEF 是不是等于0xAA55,假如不等于则去尝试其他启动介质,假如没有其他启动介质就显示"No ROM BASIC",然后死机。
f)假如 0x0000:7DEF 等于0xAA55,跳转到 0x0000:7C00 处执行 MBR中的程式。
g)MBR在主分区表中搜索标志为活动的分区,假如发现没有活动分区或有不止一个活动分区,则停止。
h)将活动分区的第一个扇区读入内存地址 0x0000:7C00处。
i)检查0x0000:7DEF 是不是等于0xAA55,假如不等于则显示"Missing Operating System"然后停止,或尝试从软盘启动。
j)跳转到 0x0000:7C00 处继续执行特定系统的启动程式。
k)启动系统。
NOTE:b、c、d、e由BIOS的引导程式完成,f、g、h、i、j由MBR中的引导程式完成。
  • 软盘启动步骤
a)系统加电;
b)BIOS加电自检 - 从内存的0xFFFF:0000处开始执行,这是BIOS在内存中的起始地址。主要是对系统关键设备如CPU、内存及硬盘等关键设备检测并根据检测结果更新ESCD(Extended System Configuration Data,扩展系统配置数据)。
c)将软盘0磁道0磁头1扇区的内容读入到内存 0x0000:7C00,并跳到0x0000:7C00处开始执行。
e)检查 0x0000:7DEF 是不是等于0xAA55,假如不等于则去尝试其他启动介质,假如没有其他启动介质就显示"No ROM BASIC",然后死机。
f)假如 0x0000:7DEF 等于0xAA55,跳转到 0x0000:7C00 处执行 MBR中的程式。
g)启动系统。
---------------------------------------------------------------------------
深入理解Linux内核中队系统启动(bootstarp)的解释和说明:
史前时代:BIOS的启动过程。主要完成四个任务:
  • POST(上电自检)
  • 初始化硬件设备
  • 搜索一个操作系统来启动
  • 找到一个有效设备,并把该设备第一个扇区的内容(即引导装入程式)拷贝到RAM中从物理地址0x00007C00处,然后跳转到这个地址处,开始执行刚才装载进来的代码。
远古时代:引导装入程式 - 由BIOS用来把操作系统的内核映像装载到RAM中所调用的一个程式。BIOS通过跳转到0x00007C00来调用引导装入程式,引导装入程式执行以下操作:
  • 从软盘启动。
    当BIOS装载软盘的第一个扇区时,实际上就是拷贝引导装入程式的代码。装入程式执行以下操作:
    a) 首先,把自己从0x00007C00处移到0x00090000处;
    b) 然后,配置从0x00003ff4开始的,向低地址方向延伸的实模式堆栈;
    c) 建立磁盘参数表,这是BIOS用来处理软盘设备驱动程式的;
    d) 调用一个BIOS过程显示 Loading信息;
    e) 调用一个BIOS过程从软盘装载内核映像的setup()代码,并把该代码放入从0x00090200开始的RAM中;
    f) 调用一个BIOS过程从软盘中装载其余的内核映像,并把内核放入低地址(0x00010000)或高低之(0x00100000)开始的RAM中;
    g) 跳转到setup()函数;
  • 从硬盘启动。
    在启动过程中装入引导程式被执行时,用户能够选择装入那个操作系统。
    a) 首先,把自己装入到0x00007C00处并执行;
    b) 然后,从0x00007C00处移到0x0009A000处;
    c) 从0x0009B000处到0x0009A200处配置实模式堆栈;
    d) 显示Loading Linux信息;
    e) 装载内核映像的setup()代码,并把该代码放入从0x00090200开始的RAM中;
    f) 把内核映像的其余部分放入低地址(0x00010000)或高低之(0x00100000)开始的RAM中;
    g) 跳转到setup()函数;
中世纪:setup()函数,虽然BIOS已初始化了大部分硬件设备,但是Linux并不依赖于BIOS,而是以自己的方式重新初始化设备以增加可移植性和健壮性。setup()函数初始化电脑中的硬件设备并为内核程式的执行建立环境,然后跳转到startup_32()函数
文艺复兴时期:startup_32()函数

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!