计算机如何启动

上一篇文章介绍了[主板和内存映射]英特尔计算机中的内存映射,以设置启动初始阶段的场景。
引导是一个复杂的,多步骤的,有趣的事情。
以下是流程概述:
在这里插入图片描述
当您按下计算机上的电源按钮时,事情开始滚动(不!不告诉!)。
主板加电后,它将初始化自己的固件(芯片组和其他花絮),并尝试使CPU运行。
如果此时出现故障(例如,CPU损坏或丢失),那么您可能会发现除了旋转的风扇外,该系统看起来已经完全失效。
少数主板设法发出哔哔声以指示CPU缺失或出现故障,但是根据我的经验,带风扇的僵尸状态是最常见的情况。
有时,USB或其他设备可能会导致这种情况发生:拔出所有不必要的设备可能会导致系统正常运行并突然死机。
然后,可以通过消除来找出罪魁祸首。

如果一切正常,CPU将开始运行。
在多处理器或多核系统中,一个CPU被动态地选择为运行所有BIOS和内核初始化代码的引导处理器(BSP)。
此时剩下的称为应用处理器(AP)的处理器将保持暂停状态,直到稍后它们被内核明确激活为止。
英特尔CPU多年来一直在发展,但是它们完全向后兼容,因此现代CPU的行为可以像最初的1978年英特尔8086一样,这正是上电后它们所做的。
在此原始加电状态下,处理器处于实模式,并且禁用了内存分页。
这就像古老的MS-DOS,其中只能寻址1 MB的内存,并且任何代码都可以写入内存中的任何位置-没有保护或特权的概念。

上电后,CPU中的大多数寄存器都有明确定义的值,包括保存CPU所执行指令的存储器地址的指令指针(EIP)。
英特尔CPU使用黑客手段,即使在加电时只能寻址1MB内存,也将隐藏的基地址(本质上是偏移量)应用于EIP,以便执行的第一条指令位于地址0xFFFFFFF0(末尾短16字节) 4 GB的内存,并且远远超过1兆字节)。
这个神奇的地址称为复位向量,是现代Intel CPU的标准地址。

主板确保复位向量处的指令是对映射到BIOS入口点的内存位置的跳转。
此跳转隐式清除加电时存在的隐藏基址。
由于芯片组保留了内存映射,所有这些内存位置都具有CPU所需的正确内容。
它们都映射到包含BIOS的闪存中,因为此时RAM模块中包含随机废话。
相关存储区域的示例如下所示:
在这里插入图片描述
然后,CPU开始执行BIOS代码,这将初始化计算机中的某些硬件。
之后,BIOS将启动开机自检(POST),以测试计算机中的各种组件。
缺少有效的视频卡,POST失败,并导致BIOS停止运行并发出蜂鸣声,让您知道问题出在哪里,因为屏幕上的消息是无法选择的。
正常工作的视频卡使我们进入了计算机看起来活着的阶段:制造商徽标被印出,内存开始受到测试,天使大怒。
其他POST故障(例如键盘丢失)会导致屏幕显示错误消息并停止运行。 POST涉及测试和初始化的混合,包括整理PCI设备的所有资源-中断,内存范围,I / O端口。
遵循高级配置和电源接口的现代BIOS建立了许多数据表,这些数据表描述了计算机中的设备。
这些表稍后由内核使用。

POST之后,BIOS想要引导一个操作系统,该操作系统必须位于某个地方:硬盘驱动器,CD-ROM驱动器,软盘等。BIOS搜寻引导设备的实际顺序是用户可配置的。
如果没有合适的启动设备,BIOS会因诸如“非系统磁盘或磁盘错误”之类的投诉而暂停。
此现象可能是硬盘坏了。
希望不会发生这种情况,BIOS会找到一个可以继续引导的工作磁盘。

BIOS现在读取硬盘的第一个512字节扇区(扇区零)。
这称为主引导记录,通常包含两个重要组成部分:MBR开头的一个特定于OS的微型引导程序,其后是磁盘的分区表。
但是BIOS对此并不关心:它只是将MBR的内容加载到内存位置0x7c00中,然后跳转到该位置以开始执行MBR中的任何代码。
在这里插入图片描述
MBR中的特定代码可能是Windows MBR加载器,来自Linux加载器(例如LILO或GRUB)的代码,甚至是病毒。
相比之下,分区表是标准化的:它是一个64字节的区域,其中包含四个16字节的条目,描述磁盘的划分方式(因此,您可以运行多个操作系统或在同一磁盘中具有独立的卷)。
传统上,Microsoft MBR代码查看分区表,找到标记为活动的(唯一)分区,加载该分区的启动扇区,然后运行该代码。
引导扇区是分区的第一个扇区,而不是整个磁盘的第一个扇区。
如果分区表出了问题,您将收到诸如“无效分区表”或“缺少操作系统”之类的消息。
该消息不是来自BIOS,而是来自磁盘加载的MBR代码。
因此,特定消息取决于MBR风格。

随着时间的推移,引导加载变得越来越复杂和灵活。 Linux引导加载程序Lilo和GRUB可以处理各种操作系统,文件系统和引导配置。
它们的MBR代码不一定遵循上述“启动活动分区”方法。
但是从功能上讲,过程如下:

MBR本身包含引导加载程序的第一阶段。 GRUB将此阶段称为1。

由于其很小的大小,MBR中的代码足以从包含其他boostrap代码的磁盘加载另一个扇区。
该扇区可能是分区的引导扇区,但也可能是在安装MBR时硬编码到MBR代码中的扇区。

然后,MBR代码加上在步骤2中加载的代码,将读取包含引导加载程序第二阶段的文件。
在GRUB中,这是**GRUB Stage 2,**在Windows Server中,这是c:\ NTLDR。
如果Windows中的第2步失败,则会显示类似“ NTLDR丢失”的消息。
然后,第2阶段代码将读取引导配置文件(例如GRUB中的grub.conf,Windows中的boot.ini)。
然后,它向用户提供引导选项,或者在单引导系统中继续进行。

此时,引导加载程序代码需要启动内核。
它必须对文件系统有足够的了解,才能从启动分区中读取内核。
在Linux中,这意味着读取包含内核的文件“ vmlinuz-2.6.22-14-server”,将其加载到内存中并跳转到内核引导程序代码。
在Windows Server 2003中,某些内核启动代码与内核映像本身是分开的,实际上已嵌入到NTLDR中。
执行几次初始化后,NTDLR从文件c:\ Windows \ System32 \ ntoskrnl.exe加载内核映像,并且就像GRUB一样,跳转到内核入口点。

有一个复杂的问题值得一提(即,我告诉过你这东西很hacky)。
当前Linux内核的映像(即使已压缩)也不适合实模式下可用的640K RAM。
我的原始Ubuntu内核已压缩1.7 MB。
但是,引导加载程序必须以实模式运行才能调用BIOS例程以从磁盘读取数据,因为此时内核显然不可用。
解决方案是古老的虚幻模式。
这不是真正的处理器模式(我希望英特尔的工程师可以这样玩),而是一种技术,程序可以在实模式和保护模式之间来回切换,以便在仍使用内存的情况下访问1MB以上的内存。 BIOS。
如果您阅读GRUB源代码,那么到处都会看到这些转换(请在stage2 /下查找对real_to_prot和prot_to_real的调用)。
在此棘手的过程结束时,加载程序通过挂钩或弯曲将内核填充到内存中,但完成后会将处理器置于实模式。

如第一张图所示,我们现在正从“引导加载程序”过渡到“早期内核初始化”。
那就是当内核开始展开并推动运动时,事物开始升温的时候。
下一篇文章将是Linux Kernel初始化的导览,并提供Linux Cross Reference的链接。
对于Windows,我不能做同样的事情;)但我要指出一些要点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值