计算机是如何启动的,网络上很多博文[2]都从 BIOS 程序的加载开始说起,有的也跳到 BIOS 程序加载 Bootloader 阶段。个人认为把这个过程称为操作系统是如何被加载并启动应该更加贴切一点。同时,也有计算机硬件大神的文章[1][5]详细分析计算机加电的过程。在阅读前人的优秀文章之后,归纳总结写下了这篇文章以梳理从计算机上电之前到操作系统开始工作的整个过程。

开机键按下之前:黑暗中的一点星光

“滴答...滴答...”微弱的声音有规律地响起。

“是谁?”从睡梦中醒来,身边漆黑一片,我惊呼出声。

“哇,终于有朋友过来陪我玩了。你好你好,我是 RTC (Real-Time Clock,实时时钟)芯片,你可以叫我小 R,计算机世界的时间由我掌控哦,厉害吧~”,小R()得瑟地说。

我刚想说话,一个年迈爽朗的笑声传来,“哈哈,孩子,你又偷偷溜出来玩啦。”一位老爷爷走过来,慈祥地摸着小 R 的小脑袋说。

“家里太无聊了嘛,都没人可以陪我一起玩,没有"电",大家都不说话。对啦,这是我的电池爷爷,爷爷特别喜欢我,能让我一直活跃着呢!”

我一拍脑袋,感情这是来到了计算机的世界呀,而且还是没接入外部电源之前的计算机。在没有外部电源的情况下,基本只有 RTC 和 CMOS 在 RTC 电源供电的情况下才能正常工作。“电池爷爷”一般是个纽扣电池。RTC 芯片保持机器内部的时钟,这也是为什么我们的计算机关机之后再次启动时间还是准确的(不考虑操作系统启动后利用网络同步时间)。而 CMOS 是电脑主板上的一块可读写的RAM芯片。因为可读写的特性,所以在电脑主板上用来保存 BIOS 设置计算机硬件参数后的数据。在计算机领域,CMOS 常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。

正回想着,突然天空一道光柱射向地面,后如溪流一般四处蔓延开来。“嘻嘻,有新朋友要醒来咯”,小 R 边跳边喊。“电池爷爷,您辛苦啦,回去休息吧,现在我能靠外面的能源生活啦。”

看来是外部的 ATX 电源接入了。ATX 会使用 5VSB 电源唤醒一部分小伙伴,例如南桥(系统 I/O 芯片)、EC(嵌入式控制器,单片机)等。" 5V Stand-By 电压为开机电路和需要唤醒机器的WOL(Wake-up On Lan)和 USB 等设备提供电源”[7],不会为 CPU 等提供工作电压。

这里需要说明一下,实际上不同的主板、应用场景都会采用不同的电源时序控制方案,笔记本采用 EC,台式机很多用SIO(Super I/O)或者定制芯片,嵌入式设备以及手机采用PMIC(Power Management IC)。以上的故事都是基于台式机形式,但是我们选用 EC 来解释电源时序控制过程,是考虑到国内关于 EC 的资料较多。与台式机不同的一点是,笔记本因为有锂电池的原因,在没有接入电源适配器前,EC 以及南桥就已经处于工作状态了。这也是为什么我们打开笔记本电脑,按下开机键,系统能接收到这个信号,并准备开始工作。

讨论到这里,基本可以形成这样一个概念:在关机状态下,只有 RTC 、EC 以及南桥部分组件在工作。纽扣电池维持着计算机的时钟信息(RTC的工作)和 CMOS 信息,而 EC 则在等待用户按下开机键。当然 EC 还负责电池的充放电的检测,指示灯,功能键等功能。

黎明:计算机开始运转

主人说要有光,按下了神圣的开机键。EC 在黑暗中接收到这个PWRSW#信号,兴奋地不行,立马去通知南桥,“PM_PWRBTN#! PM_PWRBTN#! 我们的黎明到来啦!”。

“好啦,我知道!”,南桥回应 EC 三个信号SLP_S5#(退出 S5 关机状态),SLP_S4#(退出 S4 休眠状态),SLP_S3#(退出 S3 待机状态)。

“ATX 电源,赋予我们光明吧!”EC 收到南桥发来的信号后,明白南桥已经准备就绪。ATX电源收到信号,开始工作,发出各路基本电压给主板上的各个元件。然后发送PWROK#信号给 EC,并由 EC 转发给南桥与北桥......经过一系列你来我往(这个流程必须严格控制,任意一步出错都会造成计算机无法正常启动),终于等到通知 CPU 老大的时刻啦。

”嘿,北桥大哥,我们叫 CPU 老大醒来指挥我们吧。我会告诉 CPU 老大电源都准备就绪啦。“,南桥发送PLT_RST#给北桥,紧接着向 CPU 发送 PWRGOOD#信号。北桥接收到南桥的信号,默念一秒钟后,向 CPU 老大发送了CPU_RST#信号。

从此计算机世界开始热闹起来。

BIOS 现身

目前只是所有硬件开始工作,如果整个系统中没有指令存在,CPU 醒来也不知道该去做什么。计算机启动的英文表达是bootstrap,这来自于一句谚语:"pull oneself up by one\'s bootstraps",意思是”拽着自己的鞋带把自己拉起来“。这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!早期真的是这样,必须想尽各种办法,把一小段程序装进内存,然后计算机才能正常运行[2]。

那么这就是BIOS(Basic Input/Output System,基本输入输出系统)阶段了。具体是如何工作的呢?

CPU 一醒来,毫不迟疑,立马开始工作。以Intel 32位 CPU 为例,CPU 知道自己的使命,第一步就是取地址0xFFFFFFF0[8]处的指令(CPU 设计时固化的功能,理解这个很重要)。CPU拿到指令后执行,发现这条指令是告知自己,下一次去另一个地址取指(跳转指令jmp [0xFFFF0000,0xE05B])。喔,想起来了,这是 BIOS 老弟等我去执行他保存的那一堆指令呢!CPU 又立马开始工作,通过 FSB(前端总线)将这个地址发送到北桥,然后通过 HUB-LINK 到南桥,通过LPC(Low Pin Count Bus)到 EC,再通过 X-BUS 一直到达 BIOS 取指令。在CPU读到所发出的地址内的指令后,开始 BIOS 程序执行。

BIOS 芯片中也保存了不少指令,形成的功能包括:自诊断程序:读取 CMOS 中的内容获得硬件配置信息,并对其进行自检和初始化;完整的 POST(Power On Self Test) 自检将包括CPU、640K基本内存、1M以上的扩展内存、ROM、主板、 CMOS RAM、串并口、显示卡、软硬盘子系统及键盘测试。

CMOS 设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中;对应 Dell 计算机启动时我们按F12,进入的 BIOS 设置界面。

系统自举装载程序:在自检成功后将磁盘相对 0 道 0 扇区上的引导程序装入内存,让其运行引导操作系统;

主要 I/O 设备的驱动程序和中断服务:系统硬件的变化由 BIOS 隐藏,程序使用 BIOS 功能而不是直接控制硬件。不过现代操作系统会忽略 BIOS 提供的抽象层并直接控制硬件组件。

操作系统引导:Bootloader

在前面提到,BIOS 会负责将磁盘相对 0 道 0 扇区的引导程序装入内存。不知道大家是否会有这样的疑问:为什么我们一定需要一个引导程序呢?为什么不能直接让 BIOS 将操作系统加载到内存中?

为了解答这个问题,首先要知道 Bootloader 都实现了什么功能。Bootloader 最直观的功能就是将操作系统加载到内存中。首先可以考虑在硬盘上存在多个操作系统的情况下,操作系统的加载方式过程可能就不同。如果让 BIOS 来考虑各个操作系统待加载到内存中的目的地址,这会导致 BIOS 程序的膨胀。而 BIOS 程序是固化在 BIOS 芯片中,正常情况下是无法修改的,解决加载新的操作系统出现问题就会很麻烦。而保证 BIOS 的正常功能就要降低 BOIS 的复杂性,那么适配不同操作系统的任务谁来做呢?那当然就是 bootloader 啦。并且在嵌入式环境下,操作系统的加载并不仅仅从磁盘上加载,还可能是Nor Flash 、NAND flash、USB 甚至是网络。那么 Bootloader 就应该实现基本的网络功能,例如著名的开源项目 U-Boot就是这样做的。当然本文在这里只是抛砖引玉,为什么要分出一个 Bootloader 层,可以从很多方面分析这样做的优势。

普通的 Bootloader 都需要实现什么功能呢:初始化硬件设备

为操作系统准备RAM空间

将操作系统代码载入到RAM中

设置堆栈执行环境,为高级语言(如 C 语言)提供执行环境。这里要多说一句,操作系统并不都是 C 语言写的哦。现在 Rust 语言接近 C 语言性能,并且因为其提供的安全性,已经被用来写操作系统了。

将控制权交给操作系统。到这一步,系统的完整启动也就结束啦。之后就是操作系统主宰的世界了!

参考文献

[6]. W3Cschool BIOS完全手册. 什么是BIOS和COMS

计算机怎么开机操作,计算机是如何启动的?从未上电到操作系统启动相关推荐

  1. 计算机无法开机如何读u盘启动,电脑开不开机重新安装系统步骤

    电脑开不了机可能的原因有很多,比较容易出现的就是系统故障或崩溃导致开不了机,这种情况通常只能重装系统了,下面介绍一下电脑开不开机重新安装系统步骤. 电脑开不开机重新安装系统步骤阅读 1.将U盘插在电脑 ...

  2. 计算机是如何启动的?从未上电到操作系统启动

    计算机是如何启动的,网络上很多博文1都从 BIOS 程序的加载开始说起,有的也跳到 BIOS 程序加载 Bootloader 阶段.个人认为把这个过程称为操作系统是如何被加载并启动应该更加贴切一点.同 ...

  3. 计算机无法开机如何读u盘启动,电脑无法识别U盘启动盘怎么办?

    原标题:电脑无法识别U盘启动盘怎么办? 有用户在进行U盘启动设置时,发现电脑无法识别到U盘,没办法设置从U盘启动.这是怎么回事呢?下面就让云骑士为大家带来电脑无法识别U盘启动盘解决教程. 用户须知: ...

  4. 计算机的开机启动流程详解!

    今天来谈谈计算机开机的启动流程,在我们按下电源键直到出现登录界面,计算机到底是怎样运转的. 零.boot的含义 我们都知道启动的英文单词是boot,但是boot在字典里的翻译一般是靴子,"启 ...

  5. 重启修复计算机怎么操作,如何以安全模式启动电脑,修复系统故障,这4个方法值得一试...

    在Windows 10上,安全模式允许加载一组基本功能和通用设备驱动程序,足以解决常见的软件和硬件问题. 例如,当计算机无法正常启动.网络连接问题以及应用程序或Windows Update无法下载更新 ...

  6. 计算机开机桌面黑屏怎么办,启动电脑却发现屏幕黑屏,怎么解决?

    原标题:启动电脑却发现屏幕黑屏,怎么解决? 在浏览论坛时,我们会发现很多用户都在谈论"PC开启但没有显示"的问题.但是,他们中的大多数人都不知道如何有效地快速修复"电脑启 ...

  7. 无法启动程序因为计算机中丢失礼包,Win10开机提示“计算机中丢失mfc110u.dll”的解决方法...

    小伙伴们都换好了Win10系统了吗?又没有遇见过开机就提示"计算机中丢失mfc110u.dll"的情况呢?那么Win10开机提示"计算机中丢失mfc110u.dll&qu ...

  8. 计算机无法启动vm服务,电脑中的虚拟机VM开机停留在dhcp无法启动如何解决

    ‍ 开始学习安装操作虚拟机系统的朋友可能会遇到电脑中的虚拟机VMware开机停留在dhcp无法启动的问题.其主要原因是虚拟机启动顺序是由网络为第一启动,因此,只需要将启动顺序调整为光驱启动为第一启动即 ...

  9. 计算机一打开就卡在更新失败,做系统一直在正在启动画面-电脑开机后卡在“正在启动windows”界面,怎么办?...

    电脑做系统一直安装然后又重新启动了,反复循环,开不了机,怎么办? 如果你是win10系统的话,那你就是碰见了这个无限循环的bug,许多人升级系统也和你一样出现这个情况. 方法一:可以进入BIOS将安全 ...

最新文章

  1. 第十、十一周项目五 - 摩托车继承自行车和机动车
  2. 本地Run Page时报检测到意外的 URL 参数,它将被忽略。
  3. Android项目开发填坑记-Fragment的onAttach
  4. mysql identity sql,SQL Server的Identity字段使用/复制/重设
  5. 动态规划——编辑距离
  6. php抛出异常Exception和\Exception使用区别
  7. 推荐系统000111
  8. mysql 5.0 慢日志_MySQL的慢查询日志
  9. mysql-基本操作
  10. mathcad15安装方法(解决了认证错误问题)
  11. 社交网络分析(igraph)
  12. arcgis制作遥感影像标签(分割分类目标提取方向)
  13. QT之隐藏任务栏图标
  14. 指纹图像方向图matlab,基于Matlab实现的指纹图像细节特征提取
  15. kibana基本操作
  16. STM32F103C8T6模拟IIC控制4针0.96寸OLED显示屏
  17. Adobe Photoshop CS6
  18. 啥是预乘?——Nuke中的Premult(预乘)和Unpremult(预除)
  19. es 时间过滤java,Elasticsearch过滤与聚合的先后顺序java实现
  20. 计算机专业怎么防止脱发,电脑工作者如何防止脱发出现

热门文章

  1. 你从来没有真正爱过自己
  2. 微信启动界面:张小龙的情怀和马化腾的爱好
  3. 使用C4D时,隔一会就卡死的解决办法
  4. SP业务全线回暖导致华友光线合作失败
  5. 替代Notepad++,可以试下notepad--,专门针对Notepad++替代而开发的简洁编辑器
  6. Linux 磁盘分区工具gdisk
  7. 【LVS+Keepalived】 LVS+Keepalived实现tcp、udp负载均衡及HA高可用
  8. 必读的数据库领域论文
  9. 随机键盘输入的抽奖系统
  10. 使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)