51CTO首页
AI.x社区
博客
学堂
精品班
直播训练营
企业培训
鸿蒙开发者社区
WOT技术大会
AIGC创新中国行
公众号矩阵
移动端

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

系统 其他OS
操作系统是怎样启动起来的呢?实际上这个过程就像发射火箭一样有趣,看完这篇你就明白啦。

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

操作系统也是普通程序

哦对了,顺便说下,小风哥建了一个微信技术群,感兴趣的同学可以加一下,拉到最后扫描二维码备注“加群”即可。首先我们必须意识到这样两点:

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

现在我们知道了,操作系统本身其实也是一大堆机器指令,既然是机器指令那么它必须得存放在什么地方。存放在哪里呢?想想我们编写的程序,编译后生成的是可执行文件,也就是说是以“文件”的形式存放的,并且存放在硬盘上,而操作系统也没什么不同,编译后生成的机器指令同样是以文件的形式存放的,存放在哪里呢?可以存放在任何能存储数据的介质,像CD、磁盘之类都可以。

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

鸡生蛋蛋生鸡的问题

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

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

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

时间有没有开始这个问题我不清楚,但操作系统启动的这个问题我知道。上述关于加载器以及加载加载器等问题全部指向了内存,让我们好好想一想内存有什么特殊性?

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

程序员都知道内存只有在加电的情况下才可以保存数据(关于内存的实现原理你可以参考这篇《你管这破玩意叫CPU?》),那么很显然,当断电后内存中的内容就丢失了,那么又很显然的,当你在按下计算机开关通电时,内存中的内容是未被初始化的,也就是说内存中的内容是无效的,此时的内存里还是一片荒芜,这里没有任何东西可供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的主要工作将操作系统加载到内存中,此后控制权转交给操作系统,火箭的三级发动机完成使命,到这一时刻,操作系统开始接管计算机,操作系统经过一系列自身的初始化后创建出若干必要进程,至此计算机启动完毕,卫星被成功送到了外太空中。

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

总结与脑洞

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


责任编辑:武晓燕 来源: 码农的荒岛求生
相关推荐
Python骚操作,让图片人物动起来
而今天我们就将借助论文所分享的源代码,构建模型创建自己需要的人物运动。

2020-11-16 11:50:21

Python 代码 命令
Android开发:教您如何让Gif动画动起来
本文将为讲解Android中Gif图片播放的教程。Android中是不支持直接使用Gif图片关联播放帧动画,如下动画在Android中是无法播放的,我们将教会您使用有效方法让Gif图片在Android下动起来。

2010-09-08 09:48:56

Gif播放 教程 Android
用Factory Bean让Spring配置动起来
本文介绍用FactoryBean完成Spring配置,以及FactoryBean接口的定义。

2009-06-19 11:18:51

Factory Bea Spring配置
Python+AI让静态图片动起来
这种技术一般是基于的GAN(生成对抗网络)来实现,今天我给大家分享一个开源项目,能够复现上面的效果,可以做些有趣的项目,也可以怀念故人。

2022-06-07 09:00:32

Python AI 静态图片
让统一通信系统“移动起来
本文概要:对于移动统一通信系统的应用做了简要的介绍,伴随着社交网络的发展,统一通信系统移动化也是必然趋势。

2010-05-21 11:03:51

统一通信系统
借助用友UAP平台 让业务移动起来
在“平台化”的今天,企业对移动应用的需求,已不单单是一个具体的应用,而是希望基于移动应用平台,随心所欲的开发自己想要的业务。用友UAP的开发平台提供了移动应用框架,用于支撑UAP的移动应用开发。通过移动应用框架,企业可快速的开发应用,让业务移动起来。

2013-05-27 15:35:18

用友UAP 移动应用 移动平台
JS游戏开发,让你静态人物动起来
首先,我找了一些出自经典游戏《三国志曹操传》里的素材(这些是魏将庞德的图片)。在下面我要用这些静态图片来演示如何化静为动。如果自己要演示代码,请把以上的图片下载下来,图片名为图片对应下面那一栏。

2012-09-03 09:21:51

用Pygame使你游戏角色移动起来
在本系列的第四部分,学习如何编写移动游戏角色的控制代码。在本篇文章中,我们将使用Pygame来添加键盘控制,如此一来你就可以控制你的角色的移动。

2019-05-21 14:18:09

Pygame Python 编程语言
VMware专家:行动起来 狙击云炒作
“云计算”已经被神化,在企业IT部门内也产生了两极分化,云计算成了各种会议和演讲的主题,它成了CIO时常挂在嘴边的话题,但当我问及那些在IT部门工作的朋友是否部署了私有云或用上了公共云时,他们的回答无一例外都是“没有”,许多人都表示别说云计算,就连虚拟化都还离自己很遥远。

2010-09-01 17:35:41

云计算
从零开始学习jQuery之让页面动起来
本文讲解了jQuery提供的三种动画函数:基本动画,滑动动画和淡入淡出动画.使用这三种动画已经基本可以满足我们的日常开发需求,让我们的页面动起来.简单举例讲解了自定义动画.对于想深入研究的人本文只能起到抛砖引玉的效果.

2011-06-01 14:51:54

jQuery
动图图解GC算法-让垃圾回收动起来
本文中,我们先介绍了垃圾收集的基本问题,什么样的对象可以作为垃圾被回收jvm中通过可达性分析算法解决了这一关键问题,并在它的基础上衍生出了多种常用的垃圾收集算法,不同算法具有各自的优缺点,根据其特点被应用于各个年代。

2021-09-26 09:23:01

GC 算法 垃圾
LiveWorx 18数字化转型会议:让创新动起来
PTC(纳斯达克股票代码:PTC)作为赞助商,于6月17日至20日,在波士顿的创新中心海港区举办了年度LiveWorx数字化转型会议。

2018-07-26 13:53:27

让网站动起来!12款优秀 jQuery 动画插件推荐
在网络上有大量的工具和插件可用于创建网站动画。许多开发人员正在使用HTML5和jQuery提供的最新功能来创建创建和实现震撼的视觉效果。

2014-03-21 09:52:29

jQuery 动画插件
两个简单代码片段让你图表动起来
我们以前也发过很多关于数据可视化的文章。但是对于展示来说,如果你的图表能够动起来,那么他的展示效果要比静态的图有更多的冲击力,尤其是你需要向领导和客户展示的时候。

2022-07-13 15:46:57

Python 数据可视化 代码片段
用Python实现磁盘IO操作全攻略,让数据流动起来
IO在计算机中指的是InputOutput,也就是输入输出。凡是用到数据交换的地方,都会涉及IO编程,例如磁盘、网络的数据传输。

2019-05-22 15:04:34

Python 磁盘 IO
Android应用:Call Cartoon炫图让通话界面动起来
CallCartoon来电炫图软件是一款可以让您和你朋友的手机炫起来的软件,同时还可以传递您的情感,手机的铃声从过去单一的嘟嘟声,到现在的MP3铃声,但接听时的画面,还是很单调.

2011-09-15 17:36:29

Android应用 Call Cartoo 动画
简单操作系统 FreeDOS 如何启动
概述你的计算机如何引导和启动一个像FreeDOS这样的简单操作系统。

2021-06-21 06:40:41

FreeDOS 操作系统
音视频实时连接,让你应用“能说会看”动起来
还认为只要做个APP,加个蓝牙,连个Wifii就算“智能”了在互联网+的今天,这种做法早就Out了!在“社交网络”和“视讯”高度发达的今天,你的应用,你的设备,你的终端不在“音视频实时连接”上下点功夫,那自然无法吸引消费者犀利的目光,更无法在竞争激烈的市场中脱颖而出了!2011年6月3日谷歌宣布向全世界的开发人员开放WebRTC架构的源代码,这一举措给一...

2015-12-01 13:51:52

Webrtc
数据必须流动起来,企业反应越快成功机会越大
世人普遍认为,拿破仑是位伟大的领袖和军事家。然而,尽管他的军队在欧洲战场上拥有诸多优势,包括更先进的武器、更密集的布阵和更强的机动性,但拿破仑最终还是难逃失败的命运。

2016-11-15 15:10:07

让静态知识动起来:从知识图谱到事理图谱
传统的知识图谱回答的是“是什么”的问题,而以“事”为核心的事理图谱回答的是“为什么”的问题。目前,绝大多数知识图谱主要以实体(特别是人名)为基础,面向事件知识图谱研究的语料构建和研究方法还处于探索阶段。

2021-04-12 11:47:21

人工智能 知识图谱

资讯网智能网站建设厂家成都太古里好吃的美食推荐表百度优化公司网站曼城vs里昂硬盘分区合并最简单的算命方法图解女孩用楠起名线上推广和线上营销周公解梦老公出轨别的女人票务网站制作美容美甲店起名字的怎么样给女孩子起名字不屑置辩的意思餐饮老板交流大六壬怎么算命周公解梦大全蛇武汉网站制作公司027首席的独宠新娘个性双字网名罗可以起什么名字好听电脑店店铺起名大全附近算命先生139八字免费算命算八字取名起名读后感从哪几个方面写狄夫人生活手札北京公司起名要求1000个圣经名字男孩起名考研周易专业个性签名爱少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

资讯网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化