读书笔记一 IA32 System Boot Process
发表于:2007-05-26来源:作者:点击数:
标签:
From Linux 0.0.1内核分析与操作系统设计 Chapter5 ======================================================== Title: IA32 SystemBoot Process Key: System Boot Tools in Experiment:NONE Reference:Linux 0.0.1内核分析与操作系统设计 ===============
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()函数
现代:start_kernel()函数
---------------------------------------------------------------------------
物理地址 - Physical Address:用于芯片级内存单元寻址。他们从微处理器的地址引脚发送到内存总线上的
电信号相对应。物理地址由32位无符号整数表示。
线性地址 - Linear Address:是一个32位无符号整数,可以用来表示高达4GB的地址。线性地址通常用16进制数字表示,值得范围从0x00000000到0xffffffff。
逻辑地址 - Logical Address:机器语言指令仍用这种地址指定一个操作数或一条指令的地址。每一个逻辑地址由一个段(segment)和偏移量(offset)组成,偏移量指明了从段开始的地方到实际地址之间的距离。
引导装入程序 - Boot Loader:由BIOS用来把操作系统的内核映像装载到RAM中所调用的一个程序。
主引导记录 - Master Boot Record:硬盘的第一个扇区,主要包括分区表和一个小程序。分区表的内容包括每个分区的开始扇区和结束扇区,以及对此进行处理的操作系统的类型;小程序是一个比较特殊的程序,它用来装载操作系统所在分区的第一个扇区。Linux使用LILO程序来替换这个小程序,允许用户来选择要启动的操作系统。
---------------------------------------------------------------------------
笔记:Linux源代码的调用次序是 bootsec.s -> setup.s -> head.s
在Linux下如何执行如下命令来恢复MBR:
dd if=/dev/hda of=/boot/boot.NNNN bs=446 count=1 #备份MBR
dd if=/boot/boot.NNNN of=/dev/hda bs=446 count=1 #恢复MBR
原文转自:http://www.ltesting.net
|