其他
操作系统是如何启动起来的?
The following article is from 码农的荒岛求生 Author 码农的荒岛求生
来源丨经授权转自 码农的荒岛求生(ID:escape-it)
作者丨码农的荒岛求生
操作系统也是普通程序
哦对了,顺便说下,小风哥建了一个微信技术群,感兴趣的同学可以加一下,拉到最后扫描二维码备注“加群”即可。首先我们必须意识到这样两点:CPU执行的是机器指令,编译器将程序翻译后成了机器指令 操作系统本身也是一个程序,这个程序被编译后也会生成一大堆机器指令
鸡生蛋蛋生鸡的问题
回到我们的主题,我们写的代码是loader加载到内存后运行的,那么操作系统这个程序是也同样的道理,必须得有个什么东西也要把操作系统加载到内存中运行才可以,这个东西不叫loader,而是叫boot loader,其本身也是一个程序,它的任务就是加载一个更大的程序,就像这里的操作系统。时间有没有开始这个问题我不清楚,但操作系统启动的这个问题我知道。上述关于加载器以及加载加载器等问题全部指向了内存,让我们好好想一想内存有什么特殊性?
内存断电后是无法保存数据
程序员都知道内存只有在加电的情况下才可以保存数据(关于内存的实现原理你可以参考这篇《你管这破玩意叫CPU?》),那么很显然,当断电后内存中的内容就丢失了,那么又很显然的,当你在按下计算机开关通电时,内存中的内容是未被初始化的,也就是说内存中的内容是无效的,此时的内存里还是一片荒芜,这里没有任何东西可供CPU来执行,这就好比大爆炸之前的宇宙。火箭与操作系统启动
然而现实情况比较复杂,我们刚才提到的boot loader这段小程序功能实在是太弱了,此时其能访问的磁盘地址空间有限,不能把完整的内核全部加载到操作系统中,该怎么办呢?既然boot loader比较弱那么就换一个比较牛的loader程序来,就这样出现了二阶boot loader,second stage loader:二阶boot loader功能更为丰富,比如对硬件进行检查、给用户提供选项加载哪个操作系统等等,安装多系统的同学应该知道,启动时会给你一个选项到底是启动windows还是linux,这就是二阶boot loader的作用。
接下来我们把这个过程细化一下。
更详细的启动过程
你在按下电源的瞬间相当于火箭点火,此时一级发动机开始工作。加电CPU重置后开始在地址0xffff0处开始执行指令,这个地址其实是BIOS ROM的末尾处,该位置其实是一个跳转指令,跳转到ROM的一段启动代码上,该代码会进行必要的自检,Power-on self-test (POST),展示BIOS启动界面等等,最重要的一步是找到启动设备,所谓启动设备就是指从哪里加载操作系统,比如CD-ROM、或者磁盘、甚至U盘等都可以作为启动设备,早些年流行用U盘重新安装系统,其实就是告诉BIOS的这段代码从U盘中加载操作系统。通常BIOS会把磁盘当做启动设备(大部分情况下),此时BIOS中的这段代码开始将磁盘的第0号块加载到内存中,那么这第0号块中有什么呢?没错,就是第一阶段boot loader程序,这第0号块也被称之为Master Boot Record,MBR,肯定有不少同学听说过。总结与脑洞
计算机的启动是一个多阶段的过程,当然在一些嵌入式设备等这个过程会简化,但总体上也需要经过类似过程,只不过阶段数会少一些。回到最开始的那个问题,也就是时间有没有开始,其实这个问题一些物理大牛已经回答过了,但我很想在这里开一个脑洞,当上帝在为自己创建的宇宙(计算机)加电的那一刻——也就是宇宙大爆炸时,时间开始了,时间这个概念是和宇宙(计算机)相伴相生的,如果没有宇宙(计算机),时间这个概念其实是没有意义的,就好比如果没有计算机,加载这个概念其实是没有意义的,你思考时间到底有没有起点这个问题就好比计算机中的程序在思考到底是谁把自己加载到内存的、又是谁把操作系统加载到内存中的等等。。好啦,脑洞就开到这里。现在你应该明白计算机启动这个问题了吧,啊啊啊, 可累死我了,觉得有帮助还不赶紧分享、点赞、收藏一键三连,要不你的良心过意的去吗铁子们。Redis 突然变慢了如何排查并解决?点分享
点点赞
点在看