.hd-box .hd-fr

按下电源后的几秒钟,CPU 在干嘛?

2022-11-11 20:43编程技术宇宙(轩辕之风O)48评

本文来自微信公众号:编程技术宇宙 (ID:xuanyuancoding),作者:轩辕之风 O

来电了

“来电了,来电了,起来干活了”,一大早,我还在睡梦中就被吵醒了。

我是 CPU 一号车间的阿 Q,好久不见,不知道大家有没有想我呢?

“今天不是星期六吗?怎么还要工作”,我有些不开心,本以为能睡一个懒觉,谁知道大周末的程序员还开机,这是来加班了吗。

一边抱怨,一边还得赶紧起来干活。

来到我所在的工作车间,提取指令的小 A、分析指令的小胖和负责结果回写的老 K 都已经到了,就差执行指令的我了。

我们几个各就各位,做起了准备工作。

“小 A,报告一下各个寄存器的值”,我嘱咐小 A,这是我们每天开始工作前必做的检查项。

每次一通电,咱们的电路就会启动自检工作,把所有的寄存器全部重置,如果哪里有异常的话,就会把错误记录到 EAX 寄存器中,如果发现 EAX 的值不是 0,那可就大事不好了。

“报告,寄存器已确认:”

EAX,EBX, ECX, ESI, EDI, EBP, ESP: 0x00000000

EFLAGS: 0x00000002

CS: 0xF000

EIP: 0xFFF0

······

看起来没什么问题,尤其是 CS 和 IP 这两个寄存器,决定着一会儿该从哪里开始执行代码呢。

我们是一个 64 位的 CPU,平时都是工作在保护模式下,使用虚拟地址来访问内存,由厂里的内存管理单元 MMU负责给转换成真实的物理地址。

不过在刚刚开机的这会儿功夫,虚拟地址翻译所需要的页目录、页表这些信息都还没准备好,MMU 还没法工作,这时候我们只能使用 16 位的寄存器,工作在实地址模式下,使用段 + 基址的方式来跟内存打交道,最多只能使用 1MB 的内存空间,实在是有点局促。

开始执行

“大家都准备好了吗,打起精神来,要准备开始今天的工作了哦!”

“Q 哥,这刚刚通电,内存条那家伙应该还是一片空白吧,咱们要去执行哪里的指令啊?”,小 A 问到。

“这你不用担心,在主板上,咱们 CPU 隔壁不远处有个叫BIOS的伙计,是一个ROM 芯片,咱们已经跟他约定好了,一通电他就映射到地址空间中,你尽管按照 CS:IP(0xF000:0xFFF0)指向的地方开始取指令就对了,他会安排好的”

“原来是这样”,小 A 点了点头,似懂非懂的样子。

正式开始干活了,小 A 熟练的从 F000:FFF0 处,也就是 0xFFFF0 处取到了第一条指令:jmp xxxx

好家伙,上来就是一个大跳转,我们一下来到了 BIOS 那家伙地盘的中央,开始执行他准备的程序了。

接下来执行的这一堆指令我已经做过无数次了,对主板上各单位进行检测,看看有没有异常情况,还有初始化我们工作需要的中断向量表等等,我早已经轻车熟路了。

“哥几个忙着呐”,我们正忙的热火朝天,发现有人在门口围观,回头看去,原来是隔壁二号车间、五号车间、八号车间的几个家伙。

“你们几个这么闲,要不来帮我们干会儿活?”

“哎,你想得美,你们一号核是引导处理器(BSP),待遇比我们好,这开机启动的活儿我们怎么能抢呢?”,二号车间的虎子阴阳怪气的说到。

真是羡慕他们,比我们 1 号车间上班时间晚,每次都可以多睡会儿。

MBR

我继续执行 BIOS 中的代码,一切检查完毕,没什么异常,要准备启动操作系统大佬了。

接下来,我检查了 BIOS 中配置的启动顺序,排在第一位的是硬盘兄弟。

于是我把硬盘老哥第 0 盘第 0 道第 1 扇区的内容读取到了内存中的 0x7C00 位置,他们把这玩意叫做主引导记录 MBR,一共 512 个字节。

听硬盘那哥们说,这是操作系统老大在安装的时候,写到他那里的。

他还告诉我,这个位置很重要,曾经就有病毒占据了这个位置,最后没办法只好重装系统。

MBR

读取到了 MBR 后,还得检查最后两个字节必须是 0x55 和 0xAA,看起来没什么问题,是一个合法的 MBR,我们又跳到了 0x7C00 的位置开始执行。

操作系统

终于来到操作系统的地盘儿了,在操作系统的指示下,我们切换了工作模式,开始在保护模式下工作了!

刚刚切换到保护模式下,MMU 仍然没法做地址翻译工作,我们还是只有直接使用物理地址跟内存联系,所以得赶紧把页目录和页表准备妥当才行。

忙活了一阵子之后,总算把需要的东西都弄好了,我激动的打开了内存分页的开关,通知 MMU 部门开始工作,现在我们可以使用虚拟地址访问内存了,这感觉棒多了!

这时,一旁围观的二号车间、五号车间、八号车间那几个家伙见状赶紧遛了回去,因为他们知道,马上就该他们工作了。

我们继续执行操作系统的代码,给咱们 CPU 其他所有核都准备好了数据和指令,创建了多个线程出来,把他们也叫起来一起工作,咱们这个八核 CPU 终于全面开动起来,一下子热闹了不少。

再后来,不知执行了多少指令,创建了多少线程,才把操作系统老大完整的运行了起来,成功完成了这一次的启动。

这就是通电后,我们 CPU 开始工作的日常,我已经记不清这是第多少次启动了,也不知道,我们还能启动多少次・・・

广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,IT之家所有文章均包含本声明。

下载IT之家APP,分享赚金币换豪礼
相关文章
大家都在买广告
热门评论
查看更多评论