电子产业一站式赋能平台

PCB联盟网

搜索
查看: 104|回复: 0
收起左侧

操作系统是怎么一步步启动起来的?

[复制链接]

317

主题

317

帖子

3149

积分

四级会员

Rank: 4

积分
3149
发表于 2024-9-14 17:29:00 | 显示全部楼层 |阅读模式
今天来聊聊操作系统是如何启动起来的。和我们写的helloworld程序一样,操作系统本身也是一个程序,被编译后作为文件保存在磁盘上。

blj5byklbul64031566843.png

blj5byklbul64031566843.png

我们的程序是被操作系统加载到内存运行的,在前一篇文章《程序是怎么一步步运行起来的》中有过讲解:

cvxkmybtsw364031566943.png

cvxkmybtsw364031566943.png

既然普通程序是被操作系统加载运行起来的,那么操作系统又是被谁加载到内存运行起来的?

kn3up5unwz064031567043.png

kn3up5unwz064031567043.png

想知道问题的答案,我们要从内存说起。内存只有在加电后写入数据才能保存信息:

yj5iv02cn3o64031567143.png

yj5iv02cn3o64031567143.png

内存断电后这些信息就丢失了:

gua3ujn3ruk64031567243.png

gua3ujn3ruk64031567243.png

当计算机启动时内存中一片荒芜,显然CPU不能执行来自内存中的指令:

jqvggpc4msz64031567343.png

jqvggpc4msz64031567343.png

那么在你按下开机按键时CPU执行来自哪里的指令呢?答案是来自ROM或其它非易失性内存:

vivfelnbd5v64031567443.png

vivfelnbd5v64031567443.png

这些存储设备中保存了一小段指令,计算机启动时CPU会执行这一小段程序。CPU怎么知道这段程序保存在哪里呢?答案是CPU会从一个提前设置好的位置开始执行指令,在IA-32架构在CPU会从0xffff0这个位置开始执行这段程序。这一小段程序就是我们熟悉的BIOS(Basic Input/Output System),更现代的是UEFI(Unified Extensible Firmware Interface)。

r2qu1jaklin64031567543.png

r2qu1jaklin64031567543.png

BIOS这段程序有什么作用呢?这段程序用来检查硬件,各个硬件是否能正常工作等,CPU、内存、硬盘等,也就是所谓的自检,如果恰好你拆过机器忘记把内存条装回去,那么这一小段程序就会检测出系统中没有安装内存并给出告警提示。

rrhjg3ehd4d64031567643.jpg

rrhjg3ehd4d64031567643.jpg

BIOS程序除了检查硬件之外在最后一步有一项重要的工作就是识别出操作系统保存在了哪里,也就是找到所谓的启动设备,这一般都是磁盘。找到启动设备后开始把磁盘前512字节的数据拷贝到内存,这512字节就是所谓的MBR:

fs4negrs12v64031567743.png

fs4negrs12v64031567743.png

其中包含了:
  • 一段程序,这段程序的目的是加载其它程序,因此也被称之为boot loader
  • 磁盘分区表,识别磁盘的各个分区此时BIOS执行完毕,CPU开始执行MBR中的这段boot loader程序:

    21vv4xpeq0t64031567843.png

    21vv4xpeq0t64031567843.png

    这段程序的目的是根据磁盘分区表加载一个更大的boot loader。

    ojshddrnhqh64031567943.png

    ojshddrnhqh64031567943.png

    这个更大的boot loader功能更加强大复杂,如果你安装的是多操作系统,那么当这个更大的boot loader开始执行时会给你一个选项,在这里可以用户可以选择启动哪个操作系统。

    41eqnvbfc0z64031568044.png

    41eqnvbfc0z64031568044.png

    在这里可以看到MBR中的boot loader程序加载了一个更大的boot loader程序,也因此这两个boot loader分别被称之为First stage boot loader和second stage boot loader,也就是一阶段引导程序和二阶段引导程序。

    5uq4ber3vmm64031568144.png

    5uq4ber3vmm64031568144.png

    你可能会有疑问,为什么要有多阶段引导程序呢?为什么不能一阶段引导程序直接加载操作系统呢?原因就在于MBR这个512字节的引导程序功能过于简陋,只能把磁盘中一段连续的数据copy到内存,加载操作系统这种多文件组成的大型程序需要解析文件结构,因此需要另一段功能更为强大的程序也就是二阶段引导程序的帮助。二阶引导最终识别出操作系统所在的位置并把操作系统加载到内存中。

    a45jxt3uwou64031568244.png

    a45jxt3uwou64031568244.png

    此时CPU才开始真正执行操作系统,操作系统和我们写的程序一样也有一个初始化的过程,这个过程的最后会创建出一系列用户态进程,此时操作系统系统启动完毕可以接受用户的输入。

    rzupldxiik364031568344.jpg

    rzupldxiik364031568344.jpg

    双击图标或者在命令行下输入指令时操作系统开始把我们写的程序加载到内存运行,这个过程就是在前一篇文章《程序是怎么一步步运行起来的》当然在现代使用UEFI的现代系统中就不需要MBR中的一阶引导程序了。以上就是操作系统启动的基本过程。end

    一口Linux

    关注,回复【1024】海量Linux资料赠送
    精彩文章合集
    文章推荐
    ?【专辑】ARM?【专辑】粉丝问答?【专辑】所有原创?【专辑】linux入门?【专辑】计算机网络?【专辑】Linux驱动?【干货】嵌入式驱动工程师学习路线?【干货】Linux嵌入式所有知识点-思维导图
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表