0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你知道操作系统是如何启动起来的吗

jf_78858299 来源:码农的荒岛求生 作者:码农的荒岛求生 2023-03-31 15:45 次阅读

操作系统被称为“第一个程序”,the first programme,原因很简单,只有当操作系统启动起来后才能运行我们编写的程序,那么你有没有想过这个问题:操作系统是怎样启动起来的呢? 实际上这个过程就像发射火箭一样有趣 ,看完这篇你就明白啦。

操作系统也是普通程序

哦对了,顺便说下,小风哥建了一个微信技术群,感兴趣的同学可以加一下,拉到最后扫描二维码备注“加群”即可。

首先我们必须意识到这样两点:

  1. CPU执行的是机器指令,编译器将程序翻译后成了机器指令
  2. 操作系统本身也是一个程序,这个程序被编译后也会生成一大堆机器指令

现在我们知道了,操作系统本身其实也是一大堆机器指令,既然是机器指令那么它必须得存放在什么地方。

存放在哪里呢?

想想我们编写的程序,编译后生成的是可执行文件,也就是说是以“文件”的形式存放的,并且存放在硬盘上,而操作系统也没什么不同,编译后生成的机器指令同样是以文件的形式存放的,存放在哪里呢?可以存放在任何能存储数据的介质,像CD、磁盘之类都可以。

我们编写的程序在启动时被加载器——也就是loader,加载到内存,加载器也是一个程序,这是一个加载其它程序的程序;这么说可能有点拗口,但计算机系统中有大量类似的程序,编译器是一个翻译程序的程序、操作系统是一个运行其它程序的程序、链接器是一个链接程序的程序、解释器是一个执行脚本程序的程序等等。

鸡生蛋蛋生鸡的问题

回到我们的主题,我们写的代码是loader加载到内存后运行的,那么操作系统这个程序是也同样的道理,必须得有个什么东西也要把操作系统加载到内存中运行才可以,这个东西不叫loader,而是叫boot loader,其本身也是一个程序, 它的任务就是加载一个更大的程序 ,就像这里的操作系统。

此时这里会出现一个鸡生蛋蛋生鸡的,既然我们的程序是被加载器loader(操作系统的一部分)加载到内存中,而操作系统又是被boot loader这个加载程序加载到内存中的,那么又是什么加载器把boot loader这个加载程序加载到内存中呢?而又又是什么加载器把上一句中的什么加载器加载内存中呢?而又又又是什么。。?

图片

你会发现这个一个没有出口的无穷递归啊有没有,总得有个什么把前一个程序加载到内存, 就好比今天的前一天是昨天、昨天的前一天是前天、前天的前一天是大前天,如果一直这样思考下去那么时间到底在哪里开始的呢 ?时间到底有没有开始(参考时间简史或相对论)?

时间有没有开始这个问题我不清楚,但操作系统启动的这个问题我知道。

上述关于加载器以及加载加载器等问题全部指向了内存,让我们好好想一想内存有什么特殊性?

内存断电后是无法保存数据

程序员都知道内存只有在加电的情况下才可以保存数据,那么很显然, 当断电后内存中的内容就丢失了 ,那么又很显然的,当你在按下计算机开关通电时,内存中的内容是未被初始化的,也就是说内存中的内容是无效的, 此时的内存里还是一片荒芜 ,这里没有任何东西可供CPU来执行,这就好比大爆炸之前的宇宙。

图片

但我们的计算机总是能启动起来,CPU必须得执行“一段什么程序”把第一个boot loader加载到内存中, 由于此时内存中还什么都没有,那么这段程序一定被保存在了其它地方

保存在了哪里呢?

没错,这段程序就被保存在了BIOS的非易失性存储ROM或者flash存储中了,这里的代码在即使断电后也会保存下来,加电后CPU开始执行这里代码,把boot loader加载到内存中,现在你应该明白第一个boot loader是怎样被加载到内存的了吧。

图片

在早期的计算机上甚至专门有一个按钮,让用户自己选择该从哪里,比如打孔纸带、打孔卡片或者硬盘,加载一个更复杂的程序来运行,操作面板上的旋钮可以控制把这些程序加载到内存的什么位置上去:

火箭与操作系统启动

然而现实情况比较复杂,我们刚才提到的boot loader这段小程序功能实在是太弱了,此时其能访问的磁盘地址空间有限,不能把完整的内核全部加载到操作系统中,该怎么办呢?

既然boot loader比较弱那么就换一个比较牛的loader程序来,就这样出现了二阶boot loader,second stage loader:

图片

二阶boot loader功能更为丰富,比如对硬件进行检查、给用户提供选项加载哪个操作系统等等,安装多系统的同学应该知道,启动时会给你一个选项到底是启动windows还是linux,这就是二阶boot loader的作用。

图片

最终,操作系统被二阶boot loader加载到内存中开始运行。

你会发现这个过程就和发射三级火箭一样,最初一级火箭启动,燃料用尽后二级火箭启动,二级火箭完成使命后三级火箭启动,最终把卫星送到太空,而计算机的启动过程也类似。

最初是CPU运行BIOS中的一段代码把一级boot loader加载到内存中运行,该程序又会把二级boot loader加载到内存运行,而二级boot loader又会把操作系统加载到内存中,此后控制权被转移到操作系统,(所谓控制权是指CPU跳转到操作系统的代码),操作系统开始运行,经过一系列的初始化,比如硬件检测、开启必要的后台进程等等,最终图形界面或者命令行界面呈现出来。

图片

接下来我们把这个过程细化一下。

更详细的启动过程

你在按下电源的瞬间相当于火箭点火,此时一级发动机开始工作。

加电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,肯定有不少同学听说过。

图片

到这里,火箭的一级发动机燃料用尽,二级发动机开始点火,BIOS中的这段代码把控制权交给加载到内存boot loader,所谓控制权就是跳转到boot loader程序,这样CPU终于开始直接与内存交互了,CPU开始从内存中取出指令然后执行。

MBR中除了包含一段可执行代码之外还有一个分区表,partition table,这个表的中的每一个条目本质上在说:“操作系统是否在我这个分区,我这个分区有多大”,CPU在执行MBR中的代码时会去检查操作系统存在哪个分区中,定位后开始从相应分区的起始位置读取磁盘数据到内存中,这时的磁盘数据中保存的就是二阶boot loader,second-stage boot loader,此时一阶boot loader把控制权转交给二阶boot loader,火箭三级发动机开始工作。

2_boot loader的主要工作将操作系统加载到内存中,此后控制权转交给操作系统,火箭的三级发动机完成使命, 到这一时刻,操作系统开始接管计算机 ,操作系统经过一系列自身的初始化后创建出若干必要进程,至此计算机启动完毕,卫星被成功送到了外太空中。

图片

然而限于篇幅这里依然没有过多涉及细节,操作系统本身的初始化也是一个比较复杂的过程,感兴趣的同学可以去翻阅相关操作系统的资料

总结与脑洞

计算机的启动是一个多阶段的过程,当然在一些嵌入式设备等这个过程会简化,但总体上也需要经过类似过程,只不过阶段数会少一些。

回到最开始的那个问题,也就是时间有没有开始,其实这个问题一些物理大牛已经回答过了, 但我很想在这里开一个脑洞 ,当上帝在为自己创建的宇宙(计算机)加电的那一刻——也就是宇宙大爆炸时,时间开始了,时间这个概念是和宇宙(计算机)相伴相生的,如果没有宇宙(计算机),时间这个概念其实是没有意义的,就好比如果没有计算机,加载这个概念其实是没有意义的, 你思考时间到底有没有起点这个问题就好比计算机中的程序在思考到底是谁把自己加载到内存的、又是谁把操作系统加载到内存中的等等 。。好啦,脑洞就开到这里。

现在你应该明白计算机启动这个问题了吧

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6290

    浏览量

    121898
收藏 人收藏

    评论

    相关推荐

    让PMSM简单的动起来的话,需要调用哪些头文件?

    让PMSM简单的动起来的话,需要调用那些头文件,最好解释下作用。手头有控制器,但代码太多是在看不明白。先谢过各位大佬了
    发表于 04-26 07:34

    请问怎么使无刷电机动起来,就单单动起来

    本人是51单片机学习者,刚刚接触无刷电机,但是连怎么让它动起来都搞不明白,各位可以分享一下吗?不胜感激啊,我现在就想让它动起来先而已
    发表于 04-24 00:55

    关于用labview 的x_y图里面的图形动起来

    刚学会用laview的x_Y图绘制一条直。怎么让这条y=f(t)直线动起来?向下面李萨如图形一样。有人知道李萨如图形是怎么用程序框图实现的吗?
    发表于 04-01 10:39

    【Landzo C1试用体验】+第二篇 :动起来,生活才更精彩!

    经过不懈努力,终于完善了组装,现在可以上机器人小车动起来了,动起来,才有美感家成就感。下面上图,本来要上传视频的,但是不怎么到怎么弄,要先传到优酷,在链接网址好像。下次有空再搞视频上传。在这里说两个
    发表于 06-02 18:55

    怎么把自定义时间像时钟一样动起来

    自定义之后的时间就停在定的时间那 不会像时钟一样动起来 怎么加循环让它动起来
    发表于 09-06 16:48

    如何让智能小车动起来?怎样去编写其程序?

    如何让智能小车动起来?怎样去编写其程序?怎样去选择智能小车的硬件?智能小车的硬件是如何进行连接的?如何从零开始用51单片机去实现智能小车的控制?
    发表于 07-14 06:48

    如何让无刷直流电动机动起来

    如何安排PWM序列极对数是4的电机的定转子磁极排布式如何的呢?如何让无刷直流电动机动起来?有哪些步骤?
    发表于 08-03 06:48

    如何从零开始制作51单片机控制的智能小车让它动起来

    如何从零开始制作51单片机控制的智能小车让它动起来
    发表于 10-21 07:43

    OK5718 qt程序上电显示成功可界面却没启动起来怎么回事

    上电启动显示[OK[ Started helloworld但是我的界面没有启动起来
    发表于 01-06 06:54

    如何把输入模块和输出模块联动起来

    IMX6ULL单独驱动按键或LED都实现了,那如果我想要把输入模块(比如按键)和输出模块(比如LED指示灯)联动起来,在Linux里面应该是做哪方面的操作呢?
    发表于 01-07 08:40

    Debian69系统启动起来有点卡怎么解决?

    Debian 69系统启动起来有点卡
    发表于 09-12 07:50

    苹果新机拉货PCB软板双雄动起来

    苹果新机预计9月上市,相关供应链已经开始动起来,PCB软板双雄臻鼎-KY、台郡一致表示,随着大客户新机拉货,营运自7月起增温,并可望一路旺到11月左右,但仍需关注美中贸易战对客户拉货与终端市场买气的影响。
    的头像 发表于 07-11 17:17 2928次阅读

    操作系统是如何启动起来的?

    想想我们编写的程序,编译后生成的是可执行文件,也就是说是以“文件”的形式存放的,并且存放在硬盘上,而操作系统也没什么不同,编译后生成的机器指令同样是以文件的形式存放的,存放在哪里呢?
    的头像 发表于 04-18 14:55 916次阅读

    让汽车仪表组上的指针动起来

    让汽车仪表组上的指针动起来
    发表于 10-31 08:23 0次下载
    让汽车仪表组上的指针<b class='flag-5'>动起来</b>

    步进电机如何让动起来?步进电机转动原理

    42步进电机的步距角为1.8°,是由定子和转子的齿数共同决定的,定子有48齿,转子有50齿,具体是怎么算的,感兴趣的同学可以自行学习,今天的重点是让步进电机如何让动起来
    发表于 04-01 10:40 227次阅读
    步进电机如何让<b class='flag-5'>动起来</b>?步进电机转动原理