x86计算机的启动过程主要分为这几个阶段:电源自检、BIOS自检、启动设备选择、主引导记录、加载操作系统。
电源自检
当我们按下电源按钮,打开电源时,电脑会进行一次电源自检POST,主要检查电源连接是否正常、电源开关是否正常、电源输出是否正常稳定,防止电脑硬件设备损坏。稳定的电源对于电脑来说非常重要。
图片
BIOS自检
当电源自检通过后,主板将上电并开始读取ROM中的BIOS程序,进行BIOS自检。 BIOS(基本输入输出系统),负责管理和控制计算机硬件设备,本质上是一组“程序代码”。
BIOS是电脑开机后CPU处理的第一个“可执行程序”,也是第一个“启动项”。程序代码预先烧录到主板上集成的ROM芯片中,主要存储系统设置程序、基本输入输出程序、加电自检程序和系统启动Bootloader程序等。
ROM:只读存储器不需要电源,可以保持数据不丢失。这个特性与内存形成鲜明对比
目前普遍采用Flash存储器来代替ROM。由于ROM写入后无法修改,因此切换到Flash存储器比较方便,并且可以使用特殊程序修改代码。
BIOS启动时,将开始BIOS自检,并依次执行以下操作:
它主要检测并初始化电脑的硬件设备,包括处理器、内存、硬盘、显卡、声卡等。它检测电脑内存,检查硬盘等存储设备是否正常,BIOS会还要检查计算机的其他设备,包括键盘。鼠标、显示器、声卡等显示系统信息:BIOS会在屏幕上显示系统信息,包括电脑型号、处理器型号、内存大小、硬盘容量等。图片
在此期间,如果检测到设备或硬件运行不正常,主板会发出不同的蜂鸣声(具体参见BIOS手册)作为警告,并且启动会中止。同时,我们也不用担心测试时间太长。通常,计算机的BIOS 自检在我们感觉到之前就已完成。
引导设备选择
BIOS完成硬件自检后,需要选择启动设备,主要是确定计算机从哪个设备启动,通常是硬盘或可移动设备。这一步也就是我们常说的BIOS下的启动顺序。计算机需要知道下一阶段要启动的程序放在哪个设备上。
用户可以选择从哪个设备启动计算机,例如CD或USB驱动器,然后调整启动设备的优先级。
BIOS操作界面中有一项是“设置启动顺序”。我们通常使用U盘来安装系统,所以这一步我们要设置为从U盘启动。
图片
主引导记录
当BIOS按照我们设置的启动顺序进行启动时,BIOS会将计算机的控制权交给按照这个顺序排在第一位的存储设备。主要目的是将操作系统的核心代码从硬盘加载到计算机内存中并执行。通俗地说,就是主引导程序比较小,操作系统比较大。它的任务是加载一个大的程序,这就是操作系统。
如何将操作系统的核心代码加载到计算机内存中并执行?我们只需要从第一个设备读取设备的MBR,并将程序放在内存地址位0x7c00中
MBR是什么?
MBR是存储设备中的第一个扇区,也就是磁盘的前512字节(Byte),称为“主引导记录”(简称MBR)
就不得不提一下机械硬盘的结构。机械硬盘常见部件:
图片
我们就不一一介绍了。我们直接来说说存储数据的原理。机械硬盘存储数据时,会将数据存储在其内部磁盘上。硬盘驱动器中通常有多个盘片。
盘片表面涂有磁性材料,用于记录二进制数据。由于正面和背面都可以涂有磁性材料,因此盘可以具有两个盘表面。
每个磁盘都会有一个相应的磁头,所有的磁头都会同时前进和后退,因为会有一个磁臂来固定它们。
图片
每个磁盘被分成一圈磁道,最外面的一圈是磁盘0。然后每个磁盘被分成小块,称为扇区。扇区大小是固定的,512 字节。
为什么扇区大小固定为512字节?这是行业贸易组织国际磁盘驱动设备和材料协会于1956年制定的行业标准。这是每个人都会默认遵守的标准。久而久之,如果改变的话,兼容各种情况的成本就会非常高。
我们现在常用的固态硬盘的原理与机械硬盘完全不同。如果大家有兴趣的话,可以自己去了解一下。上面已经普及了很多磁盘知识。现在让我们回到MBR。
由于BIOS很小,功能有限,为了完成加载操作系统的功能,MBR诞生了。
MBR位于磁盘0、磁道、0扇区(最外层磁盘最外磁道的第一个扇区),是存储设备的第一个扇区(大小512字节)。它存储用于启动操作系统的引导程序代码。事实上,这串代码告诉计算机去哪个地址寻找操作系统。
主引导记录由三部分组成:
占用446字节:主引导程序(也称Boot Loader)。如果将启动管理器grub直接写入mbr硬盘的主引导记录中,那么计算机BIOS在启动时就会按照预定的方式传输MBR中的代码。将其加载到内存中的指定位置,然后跳转到那里,mbr代码将开始运行。占用64字节:记录分区表。由于硬盘可以分区,并且每个区域可以安装不同的操作系统,因此主引导记录必须知道将控制权转移到哪个区域。占用2个字节:主引导记录的签名(0x55和0xAA)。如果这512字节的最后两个字节是0x55和0xAA,则表明该设备可以用于启动;如果不是,则表明该设备不能用于启动。然后控制权将转移到“启动顺序”中的下一个设备。如果最终没有找到符合条件的匹配,则直接报无启动区的错误。图片
另外,分区表的概念:分区表的长度只有64字节,分为四项,每项16字节。因此,一块硬盘只能划分为四个一级分区,也称为“主分区”。
每个主分区为16字节,由6部分组成:
第一个字节:如果是0x80,则表示主分区是活动分区,控制权转移到该分区。四个主分区中只能激活其中之一。字节2-4:主分区第一个扇区的物理位置(柱面、磁头、扇区号等)。第5个字节:主分区类型。字节6-8:主分区最后一个扇区的物理位置。字节9-12:主分区第一个扇区的逻辑地址。字节13-16:主分区中的扇区总数决定了主分区的长度。主分区的扇区总数最多不能超过2的32次方。那么看到这里,你一定有疑问吧?为什么计算机将操作系统代码加载到内存地址0x7c00,而不加载其他地址?
地址
0x7c00是什么神秘的地址?
0x7C00不属于Intel x86平台规范。即使你翻遍Intel x86手册也找不到它的定义。这实际上是历史的遗产。它首先出现在IBM PC 5150计算机中。 IBM PC 5150 是x86(32 位)IBM PC/AT 系列的祖先。它采用intel 8088芯片。后世一直沿用这个地址以保持兼容。
你是怎么得到这个地址的? IBM PC 5150计算机的操作系统是86-DOS,至少需要32KB内存。要知道那个时候记忆是非常宝贵的,能攒的就攒吧,勤俭节约。
32KB=32 * 1024 B=32768 B=0x8000 B。由于内存地址是从0x0000开始的,所以最后32位地址是0x8000 -1=0x7FFF,所以32KB的内存地址是0x0000~0x7FFF
现在已知主引导记录需要512字节,引导程序本身的堆栈/数据区也至少需要512字节。
0x7FFF -512 -512 + 1=0x7C00,因此得到地址0x7C00。
计算机启动后,内存布局如下:
+——————— 00|中断向量(中断向量表)+———————0400| BIOS数据区(BIOS数据区)+———————05?| OS加载区(操作系统加载区)+—————— —0x7C00|引导扇区(引导区)+———————0x7E00|启动数据/堆栈(启动数据/堆栈)+———————0x7FFF| (未使用)+———————(…)当操作系统启动时,主引导记录的使命就完成了。内存地址0x7C00之后的所有内存都可以被操作系统重用,凸显了节省内存的概念。
加载操作系统
操作系统的加载是计算机启动过程的最后一步。控制权将转移到操作系统。主要任务是将操作系统的所有模块加载到内存中,完成操作系统的初始化,最终实现对操作系统的完全接管。电脑
我们以Linux为例。首先,我们将加载启动目录中的内核启动文件。成功加载内核后,我们接下来会启动init进程(pid进程号为1),最后加载操作系统的各个模块,比如网络、IO等。设备、Windows等,使操作系统能够正常运行。
这里我就不详细说了。如果深入研究Linux的源代码,远远不是一篇文章能够涵盖的。稍后我会尝试更新linux0.12相关的文章,敬请期待。
直到电脑上出现我们熟悉的输入用户名和密码登录的界面。
图片
参考资料:
《Linux内核完全注释5.0》
https://www.minitool.com/lib/power-on-self-test.html
https://www.glamenv-septzen.net/en/view/6
https://www.ruanyifeng.com/blog/2015/09/0x7c00.html
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/6339.html
用户评论
想了解一下电脑开机流程,这篇文章挺详细的!
有10位网友表示赞同!
刚学电子工程,对这一块很感兴趣,正好来看一下。
有7位网友表示赞同!
每次关机重启感觉都那么神奇,原来背后是这样的?
有9位网友表示赞同!
x86架构是我一直想深入了解的,这篇文章能给我一些启发吗?
有9位网友表示赞同!
以前只觉得电脑开机快,现在知道是有复杂步骤在运作!
有20位网友表示赞同!
学习一下计算机原理对未来就业挺有益的嘛!
有5位网友表示赞同!
51CTO的文章质量一直不错,值得一看。
有18位网友表示赞同!
我想要自己动手构建一台电脑,这篇文章能不能提供一些帮助?
有6位网友表示赞同!
感觉开机过程好复杂啊,佩服程序员们搞出来这些东西。
有14位网友表示赞同!
看完文章,对电脑的启动流程有了更深的认识!
有10位网友表示赞同!
想问一下BIOS在这其中的作用是什么?
有6位网友表示赞同!
这篇文章能不能讲详细一些关于CPU和内存的功能?
有16位网友表示赞同!
学过一点C语言,这篇文章里提到的一些指令我好像也有点印象了。
有11位网友表示赞同!
以后每次开机的时候,都会想起这里说的这些过程!
有8位网友表示赞同!
x86架构的优势是什么?文章里有提吗?
有17位网友表示赞同!
除了x86架构还有其他架构吗?
有14位网友表示赞同!
学习一下计算机原理可以让我更好地使用电脑!
有18位网友表示赞同!
感觉这篇博客很有深度,值得反复阅读。
有9位网友表示赞同!
对本文感兴趣的人也可以看看关于嵌入式系统的文章吧!
有11位网友表示赞同!
以后自己写程序的时候,可以更加理解硬件的运作方式了!
有18位网友表示赞同!