当前位置: 首页 > 科技观察

操作系统是如何启动的?

时间:2023-03-21 18:49:14 科技观察

大家好,我是小风哥。操作系统被称为“第一程序”,道理很简单,我们编写的程序只有在操作系统启动后才能运行,那么你有没有想过这个问题:操作系统是如何启动的呢?事实上,这个过程就像发射火箭一样有趣。看完这篇文章,你就会明白了。操作系统也是常用程序哦,对了,小风哥建了一个微信技术群,有兴趣的同学可以加,滚到最后扫二维码备注“加群”。首先,我们必须清楚两点:CPU执行机器指令,编译器将程序翻译成机器指令。操作系统本身也是一个程序,这个程序编译后会产生很多机器指令,操作系统本身其实就是很多机器指令。由于它是一条机器指令,因此必须将其存储在某个地方。它存储在哪里?想想我们写的程序。编译后生成可执行文件,即以“文件”的形式存储在硬盘上。操作系统也不例外。编译后生成的机器指令也以文件的形式存储。它们存放在哪里?它们可以存储在任何可以存储数据的介质中,例如CD和磁盘。我们编写的程序在启动时被加载器加载到内存中——也就是加载器。loader也是一个程序,就是一个加载其他程序的程序;这么说可能有点啰嗦,但是计算机系统中有很多类似的程序编译器是翻译程序的程序,操作系统是运行其他程序的程序,链接器是链接程序,解释器是执行脚本程序的程序,等等。鸡生蛋还是蛋生鸡的问题回到我们的话题。我们写的代码是加载器加载到内存后运行的。操作系统程序也是一样的。必须有一些东西来加载操作系统。它只能在内存中运行。这个东西不叫loader,叫bootloader。它本身就是一个程序,它的任务是加载一个更大的程序,就像这里的操作系统一样。这时候,这里就会出现先有鸡还是先有蛋的问题,因为我们的程序是通过loader加载器(操作系统的一部分)加载到内存中的,而操作系统是通过bootloader的加载器加载到内存中的,那么什么loader将bootloader加载到内存中呢?而什么loader将上一句中的loader加载到内存中呢?还有,这是什么。.?你会发现这个没有出口的无限递归?有什么吗?肯定有东西把以前的程序加载到内存中,就像前天是昨天,前天是前天,前天是前天。如果你一直这样想,时间从哪里开始?时间有没有开始(参考时间简史或相对论)?我不知道时间是否开始,但我知道操作系统启动的问题。上面关于loader和加载loader的问题都是指向内存的。让我们想想内存有什么特别之处。内存在断电后不能保存数据。程序员都知道内存只有在通电的情况下才能保存。数据(内存的实现原理可以参考本文《你管这破玩意叫CPU?》),那么很明显,断电后,内存中的内容就会丢失,那么很明显,当你按下电脑开关开机时,thememory内存中的内容是未初始化的,也就是说内存中的内容是无效的。这个时候内存还是空空如也,CPU没有什么可执行的。这就像大爆炸前的宇宙。但是我们的电脑总能启动,CPU必须执行“一段程序”将第一个bootloader加载到内存中,既然此时内存中什么都没有,那么这段程序就必须保存在其他地方。它保存在哪里?没错,这个程序保存在BIOS的非易失性存储ROM或闪存中。即使关闭电源,此处的代码也会被保存。上电后,CPU开始执行这里的代码将bootloader加载到内存中,现在你应该明白第一个bootloader是如何加载到内存中的了。早期的计算机上什至有一个按钮,让用户选择从哪里加载更复杂的程序来运行,比如穿孔纸带、穿孔卡或硬盘,操作面板上的旋钮可以控制这些程序。从哪里载入内存:火箭和操作系统启动。然而,现实要复杂得多。刚才我们说的bootloader这个小程序的功能太弱了。这时候它能访问的磁盘地址空间是有限的,所以它不能把完整的内核加载到操作系统中,怎么办?由于bootloader比较弱,于是使用了更好的loader程序,于是有了second-stagebootloader,secondstageloader:第二阶段bootloader的功能更加丰富,比如检查硬件,为用户提供optionstoloadwhichoperatingsystem等,装过多个系统的同学应该知道,启动的时候会给你一个启动windows或者linux的选项。这就是二阶引导加载程序的作用。.最后,操作系统被第二阶段引导加载程序加载到内存中并开始运行。你会发现这个过程和发射三级火箭是一样的。第一级火箭启动,燃料耗尽后第二级火箭启动,第二级火箭完成任务后第三级火箭启动,最后将卫星送入太空,而计算机启动过程也类似。首先,CPU在BIOS中运行一段代码将一级引导加载程序加载到内存中运行,这段程序会将二级引导加载程序加载到内存中运行,二级引导加载器将操作系统加载到内存中。控制权交给操作系统(所谓控制权是指CPU跳转到操作系统的代码),操作系统开始运行,经过硬件检测、打开等一系列初始化必要的后台进程等,最终呈现的是图形界面或者命令行界面。接下来,我们细化这个过程。更详细的启动过程按下电源按钮的那一刻相当于火箭点火,此时第一级发动机开始工作。上电后CPU开始执行地址0xffff0处的指令,这实际上是BIOSROM的末尾。这个位置其实是一个跳转指令,跳转到ROM中的一段启动代码,代码会进行必要的Self-test,开机自检(POST),显示BIOS引导界面等,最重要的一步就是找到启动设备,所谓启动设备就是指在哪里加载操作系统,比如光驱,或者磁盘,甚至U盘等都可以作为启动设备。早年流行用U盘重装系统。事实上,这段代码告诉BIOS从U盘加载操作系统。通常BIOS把磁盘当作启动设备(大多数情况下),BIOS中的这段代码开始将磁盘的block0加载到内存中,那么block0中是什么?是的,它是第一阶段的引导加载程序。Block0也称为MasterBootRecord,MBR。想必很多同学都听说过。此时,火箭的一级发动机燃料耗尽,二级发动机开始点火。BIOS中的这段代码将控制权交给了bootloader,也就是跳转到bootloader程序,这样CPU终于开始直接和内存交互了,CPU开始从内存中取指令并执行。除了包含一段可执行代码外,MBR还有一个分区表,partitiontable,这个表中的每一项本质上都在说:“操作系统是否在我的分区中,我的分区有多大”,CPU在当MBR中的代码执行时,会检查操作系统存在于哪个分区,定位后,开始从对应分区的起始位置开始读取磁盘数据到内存中。此时磁盘数据存放在二级引导加载程序second-stagebootloader中,此时一级引导加载程序将控制权转移给二级引导加载程序,火箭的三级发动机开始工作。2_bootloader的主要工作是将操作系统加载到内存中,然后将控制权交给操作系统,火箭的三级发动机完成任务。这时,操作系统开始接管电脑,操作系统在经过一系列的初始化之后创建了一系列必要的过程,电脑启动,卫星成功送往外太空.不过限于篇幅,这里涉及的细节还是不多。操作系统本身的初始化也是一个比较复杂的过程。有兴趣的同学可以阅读相关操作系统的资料。总结和Brainhole计算机启动是一个多阶段的过程。当然这个过程在一些嵌入式设备中会被简化,但一般都需要经过类似的过程,只是阶段数会少一些。回到最初的问题,即时间开始了吗?其实这个问题已经有物理高手回答过了,不过我真的想在这里开个脑洞。当上帝将时间添加到他创造的宇宙(计算机)中时,在电的那一刻——也就是在大爆炸时,时间开始了。时间的概念伴随着宇宙(计算机)。如果没有宇宙(计算机),时间的概念其实是没有意义的,就像如果没有计算机,加载的概念实际上是没有意义的。当你思考时间是否有一个起点时,就像计算机程序在思考谁将自己加载到内存中,谁将操作系统加载到内存中等等等等。.嗯,脑洞就在这里。