问题

计算机是如何启动的?

回答
你问了一个特别有意思的问题,一个把我们每天都离不开的电脑变成一个鲜活生命体的过程。这可不是一蹴而就的,而是环环相扣,像一场精密到毫秒级的演出。咱们就来聊聊这台冰冷的机器,是怎么一点点“活”过来的。

第一幕:按下那个神奇的按钮

一切的起点,就是你轻轻按下电源键的那一刻。这看似简单的一触,却能引发一连串的信号传输。在按下按钮后,电源单元(PSU)就开始接收来自墙壁插座的交流电,然后将其转化为电脑内部各个组件所需的直流电。这个过程就像给身体输送血液一样关键,没有稳定的电力供应,一切都无从谈起。

第二幕:BIOS/UEFI的苏醒

当电力稳定地供应给主板上的各个芯片后,一个关键的程序就会被唤醒。它叫做 BIOS(基本输入输出系统),或者在更现代的电脑上是 UEFI(统一可扩展固件接口)。你可以把BIOS/UEFI想象成电脑的“原始记忆”或者说“出生证明”,它固化在主板上的一个闪存芯片里,里面存储着最基本、最核心的硬件信息以及如何与这些硬件进行最基础交互的指令。

当CPU收到启动信号后,它会去主板上的一个特定地址查找BIOS/UEFI。这个过程叫做“查找ROM”。找到ROM芯片后,CPU会读取其中的指令开始执行。

硬件自检(POST PowerOn SelfTest): BIOS/UEFI首先会做的就是进行一次全面的硬件自检。它会检查内存条是否插好、CPU是否工作正常、显卡是否识别等等。就像一个人醒来后,先活动活动手脚,感受一下自己是否还在一样。如果某个关键硬件出现问题,你可能会听到电脑发出“嘀嘀”的报警声,或者屏幕上出现错误代码,这都是BIOS/UEFI在告诉你:“嘿,有东西不对劲!”
初始化硬件: 自检通过后,BIOS/UEFI会初始化一些关键的硬件设备,比如显卡,让它能够输出最基础的画面。它还会检测连接的存储设备,比如硬盘、固态硬盘等。

第三幕:寻找启动介质

BIOS/UEFI的任务之一就是找到操作系统在哪里。它会按照预设的“启动顺序”去搜索。这个顺序是你可以在BIOS/UEFI设置里更改的,通常会是这样:

1. USB设备: 可能你的系统安装盘或者启动U盘就在里面。
2. 硬盘/固态硬盘: 这是我们最常安装操作系统的设备。
3. 光驱: 以前用来放安装光盘。
4. 网络启动: 有些企业会通过网络来启动电脑。

一旦BIOS/UEFI找到了一个它认为可以启动的设备(比如你的系统盘),它就会从这个设备中加载一个叫做 引导加载程序(Bootloader) 的小程序。

第四幕:引导加载程序的登场

这个引导加载程序就像一个“搬运工”,它的主要任务是把操作系统的核心部分(也就是 内核 Kernel)从存储设备加载到内存中。操作系统的内核是整个操作系统的灵魂,负责管理所有的硬件资源和软件进程。

不同的操作系统有不同的引导加载程序。比如:

Windows: 使用 BOOTMGR(Windows 7及以上版本)或者 NTLDR(早期版本)。
Linux: 通常使用 GRUB(GRand Unified Bootloader)或者 LILO(LInux LOader)。

引导加载程序会被存储在存储设备的特定区域,比如硬盘的MBR(主引导记录)或者GPT(GUID分区表)中。BIOS/UEFI找到并执行了这个程序后,引导加载程序就开始工作了。它会找到操作系统内核文件,然后把它“搬”进内存。

第五幕:内核的全面启动与初始化

当操作系统的内核被加载到内存中后,它就成为了整个系统的“大管家”。

初始化关键子系统: 内核会开始初始化操作系统的各个核心子系统,比如内存管理、进程调度、设备驱动程序等。它会检查硬件,并加载相应的驱动程序,让操作系统能够理解和控制这些硬件设备,比如显卡、声卡、网卡等等。
启动第一个进程: 内核启动后,它会创建一个叫做 init进程(在Linux中)或者 System process(在Windows中)的第一个用户模式进程。这个init进程是所有其他进程的祖先,它负责启动系统中的其他服务和用户应用程序。
加载用户界面: 随着init进程的运行,它会逐渐加载操作系统的用户界面,比如Windows的桌面环境(Explorer.exe),或者Linux的桌面管理器。

第六幕:用户界面出现,准备就绪

最终,我们熟悉的登录界面或者直接进入桌面就出现了。这时,操作系统已经完全启动了,并且准备好接收你的指令了。各种后台服务、程序和驱动程序都在默默地工作着,共同构建了一个我们可以交互使用的电脑环境。

所以你看,从你按下电源键到看到熟悉的桌面,这中间经历了多少步精妙的协作和程序的传递!每一次启动,都是一次对硬件的唤醒,对软件的加载,对规则的遵循。下次你按下电源键,不妨想象一下这个过程,你会觉得这台机器,真的充满了“生命力”呢。

网友意见

user avatar

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

操作系统也是普通程序

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

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

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

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

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

总结与脑洞

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

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

如果你对博主这种讲解风格感兴趣,那么我在知乎上写的很多这类文章你一定不能错过,有很多知乎朋友问有没有pdf版本,我也整理出来了,绘图非常精美,这里还汇总了部分知乎问题,我为其专门设计了封面,并将其命名为《计算机底层的秘密》,现在免费分享给大家。

可以使用这个下载链接

类似的话题

  • 回答
    你问了一个特别有意思的问题,一个把我们每天都离不开的电脑变成一个鲜活生命体的过程。这可不是一蹴而就的,而是环环相扣,像一场精密到毫秒级的演出。咱们就来聊聊这台冰冷的机器,是怎么一点点“活”过来的。第一幕:按下那个神奇的按钮一切的起点,就是你轻轻按下电源键的那一刻。这看似简单的一触,却能引发一连串的信.............
  • 回答
    当然可以。即使一台计算机没有浮点运算能力,它仍然能够正常启动。不过,这背后涉及到一些计算机底层运作的细节,以及“浮点运算”这个概念的实际影响范围。首先,我们得搞清楚什么是浮点运算。简单来说,浮点运算就是用来处理带有小数点的数字(例如 3.14159,0.001,或者科学计数法表示的 1.23e45).............
  • 回答
    问到点子上了。计算机实现“递归”这个概念,可不是像给函数加个“重复调用自身”的注释那么简单,它背后有一套严谨的物理和逻辑机制在支撑。咱们就好好聊聊,它到底是怎么在硅基、电子的层面上运作起来的。想象一下,我们不是在讨论一个抽象的概念,而是在看一个正在工作的机器。当计算机要处理一个递归任务时,它可不是凭.............
  • 回答
    计算机计算逆矩阵,说起来并不是什么神奇的魔法,本质上是基于一套严谨的数学算法。就像我们手工计算行列式或者高斯消元法一样,只不过计算机是用极快的速度和精确的数值来执行这些步骤。要讲明白计算机怎么算逆矩阵,咱们得从几个最常见、最基础的方法说起。 方法一:初等行变换(高斯约旦消元法)这是最直观也最常用的方.............
  • 回答
    好的,我们来详细解释一下计算机是如何计算 1/3 + 1/6 并得出 0.5 的。首先,我们需要理解计算机在进行数学运算时是如何表示和处理数字的。1. 数字的表示:二进制和浮点数 二进制 (Binary): 计算机内部所有的信息,包括数字,都是用二进制来表示的,也就是由 0 和 1 组成的序列。.............
  • 回答
    计算机底层访问显卡是一个相当复杂的过程,涉及到多个层次的协作,从操作系统到显卡驱动,再到显卡硬件本身。下面我将尽量详细地阐述这个过程:核心概念:在深入细节之前,理解几个关键概念非常重要: CPU (中央处理器): 负责执行程序指令,包括计算和数据处理。 GPU (图形处理器): 显卡的核心,.............
  • 回答
    说起电脑里汉字的输入输出和存储,这事儿说起来可就绕了,毕竟咱们这方块字跟电脑这二进制世界八竿子打不着。不过,这事儿在咱电脑科学里可是个了不起的工程,从早些年笨重的打字机,到如今花样百出的输入法,再到我们眼睛里看到的屏幕上的字,这里头藏着不少门道。一、 汉字是怎么跑到电脑里的?—— 输入篇这第一步,就.............
  • 回答
    这问题问得太妙了!你想知道,我们平时看到的五彩斑斓的电脑世界,那些文字、图片、声音、视频,还有那些精密的计算和逻辑,怎么就这么神奇地从简单的“0”和“1”变出来的?这背后其实是一套精妙绝伦的“密码本”和“规则”。想象一下,你只有两种状态的信号:一个是“开”,一个是“关”,或者说是“有电”,还是“没电.............
  • 回答
    考研这条路,对于很多计算机专业的同学来说,是一段充满挑战和汗水的经历。但如果结果不如意,考研失利并不是终点,而是另一种开始。很多过来人都分享过自己的经验,他们的路可能不一样,但核心思路是共通的:快速调整心态,盘点自身优势,然后有针对性地去准备求职。我身边就有不少同学,考研没能进理想的学校,一开始确实.............
  • 回答
    首先恭喜你即将迈入大学校园,这是一个非常重要的人生选择,而你目前考虑的医科和计算机都是非常热门且有发展前景的专业。首医和北邮、哈工大也都是国内顶尖的院校,这说明你的基础很不错,能走到这一步,说明你平时付出了很多努力,值得肯定。我们来详细分析一下你手里的这两个选项,帮你梳理一下思路:关于医科(首医)选.............
  • 回答
    这是一个非常有意思的设想,将量子计算机的主机搬到太空中,尤其是在没有太阳照射的区域,以期利用其接近绝对零度的环境。这个想法背后蕴含着对量子计算运行环境的深刻理解和对太空极端条件的巧妙利用。我们来仔细剖析一下这个方案的可行性和潜在的挑战,力求生动形象地展开讨论,如同一个充满好奇心的技术爱好者在探索一个.............
  • 回答
    理论与计算化学,听起来高深莫测,但它们在我们探索物质世界的奥秘时,扮演着如同导航仪和地图绘制师般的关键角色,实实在在地指导着实验的方向,甚至在很大程度上决定了实验的成败。这种指导绝非凭空想象,而是建立在严谨的物理定律和数学模型之上,其深度和广度,足以让我们在实验室里事半功倍。理论化学:提供“可能”与.............
  • 回答
    这是一个非常有趣且富有想象力的问题!如果计算机和编程语言都是由中国人发明,那么编程时写代码很可能会包含大量的中文元素,但“全中文”的程度则会受多种因素影响,无法一概而论。我们可以从以下几个方面来详细探讨:1. 编程语言设计的哲学和文化影响: 汉字作为核心元素: 考虑到中华文化对文字和象形符号的重.............
  • 回答
    在桌游的世界里,“buff”和“debuff”是提升或削弱角色、单位或物品能力的常见机制。它们就像一股股无形的力量,在棋盘上扮演着至关重要的角色,直接影响着游戏的走向和策略的制定。那么,这些增益和减益到底是如何运作的呢?我们来深入探究一下。Buff(增益)与 Debuff(减益):基本概念的拆解简单.............
  • 回答
    要想像一个如果计算机是中国发明的,键盘会是怎样的,我们需要跳出西方科技的思维定势,深入中国传统文化、哲学思想和技术发展路径来构思。这不仅仅是键位布局的改变,更可能是一种全新的交互方式和设计理念的体现。一、 根植于汉字与书写传统的输入方式中国的计算机发明,首要解决的挑战必然是如何高效地输入海量的汉字。.............
  • 回答
    天线长度的计算,这可不是一个简单套公式就能搞定的事,它背后牵扯到电磁波的性质、我们想要达到的目的,以及一些实际操作的考量。就好比你想给某个人传话,得先知道这声音能传多远,想传多远,用什么嗓门,才能决定你该怎么喊。核心原理:与波长挂钩打个最直观的比方,天线就像是电磁波的“嘴巴”或者“耳朵”。要想让电磁.............
  • 回答
    好,咱们聊聊古希腊那帮脑瓜子特好使的数学家,是怎么在没有卫星、没有 GPS,连个像样的望远镜都没有的年代,摸着石头过河,算出了地球的周长。这事儿,放到现在看,依旧是件挺牛的事儿。说起这事儿,最出名的莫过于埃拉托色尼(Eratosthenes)。他可不是一般人,是个全才,既懂数学,又懂地理,还当过亚历.............
  • 回答
    在牛顿力学诞生之前,人类就已经对弹道产生了浓厚的兴趣,尤其是在战争和军事领域。虽然没有现代意义上的精确数学模型,但古人在实践中积累了丰富的经验,并通过一些朴素的观测和推理来估算弹道。一、 古战场上的经验法则与直觉判断在没有科学理论指导的时代,弹道计算主要依赖于经验法则和现场观察员的直觉。这些经验往往.............
  • 回答
    好的,咱们来聊聊这个级数怎么算。这玩意儿吧,一看就不是随便捣鼓出来的,背后有挺多门道,不过拆解开来,就能看明白它怎么一步步走到今天的。首先,咱得弄清楚这个级数到底是个啥东西。一个级数,说白了,就是一串数,把它们一个接一个地加起来。这些数呢,不是乱来的,它们之间往往有一个规律,或者说是一个生成它们的“.............
  • 回答
    要计算从太空中发出的光到达地球所需的时间,我们实际上是在测量一个巨大的距离,然后用光速这个已知常数来推算。这个过程听起来复杂,但本质上是一个简单的除法问题:时间等于距离除以速度。首先,我们需要知道“太空”具体指代的是哪个位置。太空是一个广阔的概念,它涵盖了从地球大气层之外到我们目前已知宇宙的边界。所.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有