同一个 Windows 能装在上千种不同的主板上,靠的是驱动程序——它把硬件的脾气翻译成统一接口;但 CPU 指令集它吸收不了。
7.1 摆出了两层差异,这一节看操作系统能替我们吸收掉多少。
一、驱动:把硬件的脾气翻译过来
主板、显卡、网卡、打印机……牌子型号千差万别,接口各不相同。 操作系统的办法是:每块硬件配一份驱动程序,由它去做翻译。 于是程序看到的永远是同一个【磁盘】、同一个【打印机】。 换一块不同牌子的显卡,程序一行都不用改——这就是驱动存在的价值。
二、驱动其实就是那段【和硬件打交道的代码】
Windows 本身只定义了接口的样子,具体怎么跟这块硬件说话,交给驱动去干。 所以驱动写得好不好,直接影响稳定性——蓝屏的经典原因之一就是驱动出问题。 这也解释了一个现象:新硬件上市初期总容易出毛病,因为驱动还没打磨好。 而系统更新里那些【改善兼容性】的条目,多半就是在更新驱动。
三、唯一吸收不掉的是 CPU
驱动能吸收除 CPU 之外的硬件差异——这句话是本节的关键。 因为指令集是另一回事:x86 和 ARM 的机器码压根不是同一种语言。 驱动程序自己也是代码,它同样要用某种 CPU 的指令来写。 所以【一个 exe 装遍所有电脑】这句话里,其实默默假设了大家都是同一种 CPU。
四、这一条的后果
同一份 Windows,装在不同 CPU 上就是两套不同的版本。 同一个软件,也得按 CPU 分别出安装包(这也是为什么下载页常有好几个安装文件)。 想真正做到【一份代码到处跑】,只能再往上垫一层——那就是 7.5 要讲的虚拟机。 所以这一节给出的结论很干脆:操作系统能抹平硬件的型号差异,却抹不平 CPU 的语言差异。
五、动手 Demo:Windows消除了CPU之外的硬件差异
同一个 Windows 能装在千百种不同牌子的主板上,靠的是驱动程序。 但有一件事它也吸收不了:CPU 的指令集。
import platform, struct
print("处理器架构", platform.machine())
print("指针宽度 ", struct.calcsize("P") * 8, "位")
print("本机代码是这一种 CPU 专用的,换 CPU 就得重编")
实跑输出:
--------------------------------------------------------------------
Windows消除了CPU之外的硬件差异
--------------------------------------------------------------------
同一个 Windows,**能装在千百种不同牌子的主板上**。
靠的是**驱动程序**:每块硬件配一份,**把硬件的脾气翻译成统一的接口。**
于是程序看到的永远是同一个【磁盘】、同一个【打印机】——**不用管牌子。**
但有一件事 Windows 也吸收不了:**CPU 的指令集。**
差异类型 谁来吸收 能不能吸收掉
-------------------------------------------------------------------
主板、显卡、网卡 驱动程序 能,程序只调统一接口
磁盘、打印机、键盘 驱动程序 能,程序看不到牌子
屏幕分辨率、声卡型号 驱动程序 能,由系统统一表示
CPU 指令集(x86/ARM) 没有人 不能,必须是不同的本机代码
实测一下眼前这台机器的【不可吸收项】:
处理器架构 AMD64
指针宽度 8 字节(64 位)
本机代码是 这一种 CPU 专用的,换 CPU 就得重编
所以【一个 exe 装遍所有电脑】这句话,**默认了大家都是同一种 CPU。**
一旦换成另一种指令集,**连 Windows 也救不了——只能重新编译。**
驱动能吸收主板、显卡、网卡、打印机的差异,但 CPU 的指令集没有人能吸收。 所以同一个 exe 装遍所有电脑,前提是这些电脑用的是同一种 CPU。
30 秒实验
- 去下载页看看一个软件提供几个安装包,猜一猜它们是为哪些 CPU 准备的。
- 想一想:为什么同一块显卡换到另一台电脑上,要先装驱动。
常见误区
- 以为 Windows 能吸收一切硬件差异。CPU 指令集它吸收不了。
- 以为驱动是【附带的小工具】。它是操作系统与硬件之间唯一的翻译。
自测三问(点开对答案)
1. 驱动程序的作用是什么? —— 把各家硬件的差异翻译成统一的接口,让程序不必区分硬件型号。 2. Windows 吸收不了哪种差异? —— CPU 的指令集差异——x86 与 ARM 的本机代码不是同一种语言。 3. 为什么同一个软件常有多个安装包? —— 因为要针对不同的 CPU 架构(以及操作系统)分别编译本机代码。- ☐ 下一节(7.3 每种操作系统的API都是不同的)
相关笔记
- 运行环境=操作系统+硬件 — 两层差异的来历
- 每种操作系统的API都是不同的 — 系统层的差异怎么处理
- 将内存当成磁盘使用的固态硬盘 — 也是【看不见底下是什么】的一例
- 🖥️ 服务器工作原理 · 索引 — 服务器怎么攒出来的
- ⚙️ 程序是怎样跑起来的 · 索引