计算机开机启动过程

69 篇文章 4 订阅
44 篇文章 2 订阅

一、总过程
PC机启动时ROM BIOS(Basic Input Output System)中的程序会把默认启动驱动器上的引导扇区代码和数据读入内存,而引导扇区代码则负责把操作系统加载程序和内核执行代码读入内存中,然后把控制权价交给操作系统加载程序(如果是硬盘启动,则是磁盘第一个扇区中位于主引导分区MBR-Master Boot Recoder内的引导加载程序Boot loder)去进一步准备内核的初始化操作,最终加载程序会把控制权交给内核代码。接下来内核代码若要正常运行就需要文件系统的支持了。


二、详细过程

1、BIOS在主存储器中的位置
早期的PC机所采用的8088/8086CPU只有20根地址线,因此寻址范围最高为 220KB=1024KB=1MB 。随着计算机软件和硬件技术的高速发展,目前的计算机都采用Intel32位CPU,CPU的物理内存寻址范围已高达4GB。但是为了与早期的PC机在软件上兼容,系统前1MB以内物理内存使用分配上仍然保持与原来的PC机基本一致,只是原来系统ROM中的BIOS一直处于CPU能寻址的内存最末端位置,而BIOS原来所在的位置将在计算机开机初始化时被作为BIOS的影子(Shadow)区域,即代码仍然会被复制到这个区域中,如左图所示。
2、物理内存的分配
地址0x000A0000到0x000FFFFF(640K到1M共384K)和0xFFFE0000(rong:是否应该为0xFFFEFFFF才对?)到0xFFFFFFFF(4G处的最后一64K)范围以外的所有内存区域都可作为系统内存。这两个特定范围被用于I/O设备和BIOS程序。假如计算机有16MB的物理内存,那么在Linux 0.1x版本的系统中,0~640K将被作为存放内核代码和数据。Linux内核不使用BIOS功能,也不使用BIOS设置中的中断向量表。640K~1M之间的384K仍然保留用做图中指明的用途:地址0xA0000开始的128K用作显示内存缓冲区,随后部分用于其它控制卡的ROM BIOS或其映射区域,而0xF0000到1M范围用于高端系统ROM BIOS的映射区。1M~16M将被内核用于作为可分配的主存区。另外高速缓冲区和内存虚拟盘也会占用内核代码和数据后面的一部分内存区域,该区域通常会跨越640K~1M的区域。
3、BIOS的作用
存放在ROM中的系统BIOS程序主要用于计算机开机时执行系统各部分的自检,建立起操作系统需要使用的各种配置表,例如中断向量表、硬盘参数表,并且把处理器和系统其余部分初始化到一个已知状态,而且还为DOS等操作系统提供硬件设备接口服务。但是由于BIOS提供的这些服务不具备可重入性(即其中程序不可并发执行),并且从访问效率方面考虑,因此除了在初始化时会利用BIOS提供的一些系统参数以外,Linux操作系统在运行时并不适用BIOS中的功能。
4、开机启动
当计算机系统上电开机或者按了机箱上的复位按钮时,CPU会自动把代码段寄存器CS设置为0xF000,其段基地址则被设置为0xFFFF0000rong:F000H左移4位F0000H,然后A20~A31置1。),段长度设置为64KB,而IP被设置为0xFFF0,因此此时CPU代码指针指向0xFFFFFFF0处(rong:0xFFFF0000+0xFFF0=0xFFFFFFF0),即4G空间最后一个64K的最后16字节处,由上图可知,这正是系统ROM BIOS存放的位置。并且BIOS会在这里存放一条跳转指令JMP跳转到BIOS代码中64KB范围内的某一条指令开始执行。


由于目前PC微机中BIOS的容量大多有1MB~2MB,并存储在闪存(Flash Memory)ROM中,因此为了能够执行或访问BIOS中超过64KB范围且又远远不在0~1MB地址空间中的其它BIOS代码或数据,BIOS程序会首先使用一种称为32位大模式(Big Mode)技术把数据段寄存器的访问范围设置成4G(而非原来的64k)(rong:2的16次方=64k),这样就可以在0~4G范围内执行和操作数据。此后,BIOS在执行了一系列硬件检测和初始化操作后,就会把与原来PC机兼容的64KB BIOS代码和数据复制到内存前端1M末端的64K处,然后跳转到这个地方并且让CPU进行真正的实地址模式,(rong:在此之前CPU都是直接读取ROM中BIOS进行执行,64KB BIOS代码复制到RAM后才读取RAM进行执行。注1)如右图所示。最后BIOS就会从硬盘或其它块设备把操作系统引导程序加载到内存0x7c00处(注2),并跳转到这个地方继续执行引导程序。

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

注1

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

刚上电的时候内存是空的,肯定是从bios开始运行的,只不过把不同的设备统一编址罢了,貌似从内存启动。

注2

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

对于很多人来讲0x7C00这个地址是很神秘的,不知道这是干什么的。但是对于了解过x86平台下BIOS启动过程的人,对这个地址再熟悉不过了。BIOS就是将MBR读入0x7C00地址,然后进行后续的引导的。操作系统或是bootloader开发者必须假设 他们的汇编代码被加载并从0x7C00处开始执行。

0x7C00的定义
对于这个地址,它不属于Intel x86平台规范的,而是属于BIOS规范中定义的内容。0x7C00第一次出现在IBM PC 5150的BIOS处理int 19(19号中断)的时候,IBM PC 5150是x86(32位)IBM PC/AT系列的祖先,这款PC于1981年发布,使用了intel 8088(16位)的处理器和16KB的RAM内存,BIOS和微软的基本指令均放在该内存中。
当打开电源,BIOS开始自检,然后出发19号中断,在处理19号中断时,BIOS检测电脑是否具有软盘、硬盘或是固定磁盘,如果有任何可以使用的磁盘,BIOS就把磁盘的第一个扇区(512B)加载到内存的0x7C00地址处。

0x7C00的前身
0x7C00地址第一次出现在IBM PC 5150的ROM bios中,在此之前使用的地址是0×200。使用该地址的原因主要有:当时8086中断向量使用地址为0×0-0x3FF;86-DOS从0×400处被加载;而它不使用0×200-0x3FF这段中断向量地址。因此这段0×200-0x3FF地址不能被其他程序使用,Tim Paterson(86-DOS开发者)选择0×200作为MBR加载地址。

0x7C00的意义
他们想留下32kb内更多的空间给操作系统来加载自己;8086/8088使用0×0-0x3FF作为中断向量,然后BIOS数据紧随之后;引导扇区是512字节,但是用于引导程序的栈或数据区域需要多于512字节;因此0x7C00,32kb(rong:0x8000=32kb=32768b 0x7C00=31744b)中的最后1kbrong:0x7C00=31744b32768-31744=1024)被选中。

一旦操作系统被引导并开始,引导扇区将一直不会被使用直到重启,因此操作系统和应用程序可以自由的使用32KB的最后1kb空间。在操作系统被加载后,内存布局如下:

+——————— 0×0
| Interrupts vectors(中断向量表)
+——————— 0×400
| BIOS data area(BIOS的数据区域)
+——————— 0×5??
| OS load area(操作系统加载区域)
+——————— 0x7C00
| Boot sector(引导区域)

+——————— 0x7E00
| Boot data/stack(引导数据/堆栈)

+——————— 0x7FFF
| (not used)
+——————— (…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值