首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从操作系统到 BIOS:运行环境原来这么复杂

从操作系统到 BIOS:运行环境原来这么复杂

作者头像
Lihua奏
发布2026-06-23 20:32:39
发布2026-06-23 20:32:39
1810
举报

从操作系统到 BIOS:运行环境原来这么复杂

运行环境是什么

首先,先知道一个概念: 运行环境 = 操作系统 + 硬件

那么,先提出一个问题:你写了一个程序,为什么它不能在任何地方运行

程序运行需要 操作系统硬件 同时满足条件

一个比喻

想象一个场景:

  • 程序 是一道菜
  • CPU 是厨师
  • 操作系统是厨房

目标: 把这道菜放进去烤箱烤10分钟

场景一: 厨房有烤箱 -> 顺利执行

场景二: 厨房没有烤箱,只有高压锅 -> 出现问题 -> 无法执行

  1. 这套设备根本不支持“烤箱”这一类做法(可以类比成底层硬件或CPU架构不兼容)
  2. “烤”这个操作根本没有(也可以类比成操作系统没有提供对应的API)

那么这个问题会出现什么后果?

写一个软件,要针对每种平台都写一遍,开发成本极高

如何解决这个问题

1. window:屏蔽 CPU 之外的硬件差异

核心概念:不让程序直接去操作硬件,否则必须为每一种硬件组合写不同的代码

解法逻辑:

代码语言:javascript
复制
程序(只调用 windows api) -> windows 系统调用层 -> 驱动程序层 -> 实际硬件

windows 系统调用层:所有程序看到的接口都一样

驱动程序层(NVIDIA驱动 AMD驱动):通常由硬件厂商提供,对上统一接口

实际硬件:如显卡 声卡 网卡

windows 就像翻译官,程序说要 “播放声音”,windows就把这句话翻译成不同硬件能够理解的方式,再交给下面的驱动程序层

2. Linux:源代码分发

我们先来看一个问题,windows 确实在很大程度上解决了 “同一 OS 下的硬件差异”,但 OS 本身之间的差异 仍然存在

比如:Windows 和 Linux

目标:打开一个文件

代码语言:javascript
复制
Windows:
    HANDLE h = CreateFile("data.txt", GENERIC_READ, ...);

Linux:
    int fd = open("data.txt", O_RDONLY);

可以看出,即使 CPU 相同,程序也不一定能在不同的 OS 下直接运行,因为它依赖的系统调用接口、可执行文件格式、运行时环境都可能不同

那么 运行环境变得更清晰了

运行环境 = CPU 架构 + 操作系统

那在 Linux 生态里,一种很常见的解决办法是什么?就是 源代码分发

不分发编译好的程序,直接分发源代码,让用户在自己的机器上编译

  • 传统方式 [x86 + linux] -> x.exe -> [arm + linux] 无法运行
  • linux方式 .c -> [ARM/x86 + linux / windows] 本地编译器 -> 生成本机可执行文件
  • 优点:自动适配本机 CPU 和 OS,兼容性高
  • 缺点:用户需要使用编译器,使用程序门槛变高

Java 虚拟机

这种方式不太好,使用门槛变高,会变相地流失很多用户,那么 Java 虚拟机就出现了

Java 虚拟机:一次编写,处处运行

它的做法是这样的:创造一个 "中间层",再由中间层去适配各种环境

这和上面的 windows 做法有点像,本质上也是在程序和真实运行环境之间再加一层适配。不过这里适配的对象,已经不只是同一 OS 下的硬件差异,而是更广义的平台差异

代码语言:javascript
复制
传统编译: 源代码 -> 编译器 -> x86机器码 / ARM机器码

java:    源代码 -> java编译器 -> 字节码 -> 不同平台上的 JVM 执行
  1. 字节码:不是任何真实 CPU 的机器语言,它是专门为 JVM 设计的“虚拟 CPU 的指令集”
  2. JVM(Java 虚拟机,Java VM):也叫Java虚拟机,它负责在不同平台上执行 Java 字节码,并把这些字节码转换成当前机器能够运行的形式

这么说有点抽象,

  • 字节码: 就像"普通话"
  • CPU: 对应的 "各个方言"
  • JVM:则对应能够听懂普通话的人,然后再把普通话翻译成 CPU 能够听懂的方言 在执行

那代价就是,会多一层运行时开销

原本执行机器码的流程:CPU → 指令 → 执行

JVM执行字节码:CPU → JVM处理字节码 → 转成当前平台可执行的形式 → 执行

云计算

云计算:按需租用运行环境

核心概念:不只是搬程序,而是把“运行环境”本身也变成一种可以出租的服务

可分为:SaaS、PaaS、IaaS

  • SaaS(Software as a Service,软件即服务) 你直接用软件,什么都不用管
  • PaaS(Platform as a Service,平台即服务) 提供操作系统和运行时,你只管部署代码
  • IaaS(Infrastructure as a Service,基础设施即服务) 提供虚拟机(CPU + 内存 + 硬盘),你自己装操作系统和软件

SaaS就像是去饭店吃饭。PaaS是在厨房,工具给你配好了。IaaS则更像是只给你厨房场地和基础设施,剩下很多东西都要自己来配

系统是怎么启动的

最后,还有个最根本的问题:电脑刚通电,操作系统还没有加载到内存中来,谁来启动系统?

这有点像“先有鸡还是先有蛋”的问题

没有运行操作系统我怎么写进内存?操作系统没在内存我怎么运行?

这时,BIOS 就出现了。这里可以先把它理解成机器通电后最先运行的一小段固化程序

它是这样做的

  1. 自检硬件:检查CPU、内存、硬盘是否正常
  2. 找到启动设备(一般是硬盘,也有u盘)
  3. 读取启动设备上的引导信息(在传统 BIOS 场景下,常常会从磁盘前面的启动区域开始读取)

引导并装入程序(Bootloader):比如 windows Boot Manager 这一类启动程序

  1. 被 BIOS 加载到内存中
  2. 找到操作系统的内核文件
  3. 把操作系统加载进内存 (先有鸡还是先有蛋的问题解决了)

这个过程被叫做 自举(Bootstrap):用一个小程序拉起一个更大的程序,一次又一次,最终把操作系统拉起来

打个比方:就像学习,你不会一上来就什么都会,而是有许许多多的基础知识,来理解更高级的知识

总结

最后收一下,如果只用一句话去理解 运行环境,那就是: 程序不是写完就能跑,而是要放到一个合适的环境里,它才能真正跑起来。

这个环境不只是电脑这么简单,它背后还包括 CPU 架构操作系统、驱动、运行时,甚至平台本身提供的接口。前面讲 Windows、Linux、JVM,本质上都在解决同一个问题: 怎么让程序和运行环境对得上。

所以理解运行环境,其实就是在理解一件事: 写程序不能只盯着代码本身,还要看它最后是在哪跑、靠什么跑、换个地方还能不能跑。而最后讲到 BIOS、Bootloader 和 Bootstrap,其实又把这个问题往前推了一步: 不只是程序要有运行环境,连操作系统自己,也得先被一步一步拉起来,才能让后面的东西开始运行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 从操作系统到 BIOS:运行环境原来这么复杂
    • 运行环境是什么
    • 一个比喻
    • 如何解决这个问题
      • 1. window:屏蔽 CPU 之外的硬件差异
      • 2. Linux:源代码分发
    • Java 虚拟机
    • 云计算
    • 系统是怎么启动的
    • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档