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

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

3天内不再提示

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

Q4MP_gh_c472c21 来源:码农的荒岛求生 作者:码农的荒岛求生 2022-04-18 14:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,我是小风哥。

操作系统被称为“第一个程序”,the first programme,原因很简单,只有当操作系统启动起来后才能运行我们编写的程序,那么你有没有想过这个问题:操作系统是怎样启动起来的呢?

实际上,这个过程就像发射火箭一样有趣。看完这篇文章,你就明白啦~

5b497408-bed7-11ec-9e50-dac502259ad0.jpg

操作系统也是普通程序

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

CPU执行的是机器指令,编译器将程序翻译后成了机器指令

操作系统本身也是一个程序,这个程序被编译后也会生成一大堆机器指令

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

存放在哪里呢?

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

5b523dd6-bed7-11ec-9e50-dac502259ad0.png

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

鸡生蛋蛋生鸡的问题

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

5b6a1474-bed7-11ec-9e50-dac502259ad0.png

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

5b7220e2-bed7-11ec-9e50-dac502259ad0.png

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

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

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

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

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

5b7c661a-bed7-11ec-9e50-dac502259ad0.png

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

保存在了哪里呢?

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

5b8c0926-bed7-11ec-9e50-dac502259ad0.png

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

火箭与操作系统启动

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

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

5b9c1f46-bed7-11ec-9e50-dac502259ad0.png

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

5bb25ac2-bed7-11ec-9e50-dac502259ad0.png

最终,操作系统被二阶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,肯定有不少同学听说过。

5bce03da-bed7-11ec-9e50-dac502259ad0.png

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

5bd8bcbc-bed7-11ec-9e50-dac502259ad0.png

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

总结与脑洞

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

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

好啦,脑洞就开到这里,现在你应该明白计算机启动这个问题了吧~

END

审核编辑 :李倩

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

    关注

    68

    文章

    11331

    浏览量

    225908
  • 操作系统
    +关注

    关注

    37

    文章

    7439

    浏览量

    129623
  • 编译器
    +关注

    关注

    1

    文章

    1673

    浏览量

    51917

原文标题:操作系统是如何启动起来的?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    兆芯全系列CPU深度适配统信桌面操作系统V25

    这款号称国内操作系统里程碑式版本的统信桌面操作系统V25在智能化、高效性、可靠性三个维度实现了突破,推动国内操作系统从“可用”全面迈向“成熟与智能”的发展新阶段。V25桌面操作系统与兆
    的头像 发表于 04-15 18:03 968次阅读

    主流国产操作系统解析:技术特点与行业适配指南

    在信创产业全面推进、核心技术自主可控成为发展主线的背景下,国产操作系统已完成从技术突破到生态落地的关键跨越,形成多品牌差异化竞争的市场格局。各类操作系统依托自身技术优势,在党政、金融、能源、教育
    的头像 发表于 03-27 14:27 226次阅读

    openKylin赋能国防科大构建操作系统创新型人才培养体系

    国防科技大学操作系统团队在承担国家重大科研任务、推进麒麟操作系统研发和推广应用的过程中,立足工程实践和科研创新能力培养需求,针对传统操作系统教学面临的诸多挑战,在开放协作、创新竞赛、实习实训等方面
    的头像 发表于 01-23 13:49 563次阅读

    操作系统体系结构

    操作系统的体系结构是一个开放的问题。正如上文所述,操作系统在核心态为应用程序提供公共的服务,那么操作系统在核心态应该提供什么服务、怎样提供服务?有关这个问题的回答形成了两种主要的体系结构:大内核和微
    发表于 01-15 08:19

    操作系统运行机制

    计算机系统中,通常CPU执行两种不同性质的程序:一种是操作系统内核程序;另一种是用户自编程序或系统外层的应用程序。对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程
    发表于 01-15 07:12

    普华基础软件出席开源车用操作系统人才培养启动仪式

    与产业需求之间存在显著缺口。本次启动的“开源车用操作系统人才培养”,是普华基础软件开源“星辉计划”五大生态体系中的关键一环,旨在通过“开源共建”模式,系统性破解人才难题,为产业可持续发展夯实基础。
    的头像 发表于 12-18 17:11 1389次阅读

    龙蜥操作系统装机量突破1000万

    11月17日,以“生态共融·智驱未来”为主题的2025龙蜥操作系统大会(OpenAnolis Conference)在北京成功举办。千余位全球技术大咖、业界精英和行业开发者齐聚一堂,深入探讨AI时代下操作系统产业发展的新趋势、新挑战与新路径,共话龙蜥社区引领
    的头像 发表于 11-20 11:40 956次阅读

    单片机的操作系统

    单片机操作系统主要分为实时操作系统(RTOS)和嵌入式操作系统两类,以下是常见选择: 实时操作系统(RTOS) ‌ FreeRTOS ‌:轻量级开源内核(最小内核约6 KB RAM)
    发表于 11-14 06:18

    嵌入式实时操作系统的特点

    实时嵌入式操作系统(Real-Time Embedded Operating System)是专门设计用于嵌入式系统的实时操作系统。嵌入式系统是一种特殊的计算机
    发表于 11-13 06:30

    如何选择合适的实时操作系统

    选择合适的实时操作系统(RTOS,Real-Time Operating System)可能会影响你在不同行业的职业发展路径。
    的头像 发表于 09-09 14:47 1248次阅读

    商汤办公小浣熊与银河麒麟操作系统V11完成适配

    近日,在2025 中国操作系统产业大会上,商汤科技作为麒麟软件的生态伙伴受邀参与了“麒心伙伴5.0生态成长计划”启动仪式,同时商汤「办公小浣熊」也完成与银河麒麟操作系统 V11 的深度适配,双方将在AI + 办公领域打造的「办公
    的头像 发表于 09-05 15:26 997次阅读

    树莓派操作系统:版本、特性及设置完整指南!

    树莓派操作系统是什么?树莓派操作系统是由树莓派基金会专为树莓派开发的官方操作系统。它基于DebianLinux发行版,并针对树莓派的ARM架构进行了专门优化。树莓派操作系统有多个版本,
    的头像 发表于 07-28 18:26 1827次阅读
    树莓派<b class='flag-5'>操作系统</b>:版本、特性及设置完整指南!

    无人职守自动安装部署操作系统指南

    当组织有服务器需要部署linux系统时,需要通过网络方式安装并结合自动应答文件,实现无人职守自动安装部署操作系统。这种方式需要我们至少配置一台服务器,所有需要安装系统的客户端通过网络的方式连接服务器端
    的头像 发表于 05-22 13:38 1174次阅读
    无人职守自动安装部署<b class='flag-5'>操作系统</b>指南

    鸿道Intewell操作系统:人形机器人底层操作系统

    操作系统的实时性赋能东土科技的鸿道(Intewell)工业操作系统作为国内唯一通过汽车、工业控制、医疗、轨道交通四项功能安全认证的系统,为标准体系中的技术层架构提供了底层支持。其微内核虚拟化架构可将人形机器人电子架构成本降低50
    的头像 发表于 05-16 14:44 969次阅读

    理想汽车智驾操作系统解读

    [首发于智驾最前沿微信公众号]在智能网联与生成式AI技术深度融合的浪潮下,汽车操作系统已经从最初的简单资源管理平台,演化为承载感知决策、执行控制与安全防护的智能化中枢。理想汽车自主研发的星环OS
    的头像 发表于 05-13 10:54 1444次阅读
    理想汽车智驾<b class='flag-5'>操作系统</b>解读