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

共 2342字,需浏览 5分钟

 ·

2021-04-27 23:47

来电了

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

我是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开始工作的日常,我已经记不清这是第多少次启动了,也不知道,我们还能启动多少次···

彩蛋

“Q哥,隔壁BIOS芯片老哥摊上事儿了,程序员嫌我们启动太慢 ,拿他开刀了”

“纳尼,那以后还怎么启动?”

“听说用了一个新方案,叫UEFI

预知后续如何,请关注下回精彩···


1、最牛逼的 Java 日志框架,性能无敌,横扫所有对手!
2、把Redis当作队列来用,真的合适吗?
3、惊呆了,Spring Boot居然这么耗内存!你知道吗?
4、牛逼哄哄的 BitMap,到底牛逼在哪?
5、全网最全 Java 日志框架适配方案!还有谁不会?
6、30个IDEA插件总有一款适合你
7、Spring中毒太深,离开Spring我居然连最基本的接口都不会写了

点分享

点收藏

点点赞

点在看

浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报