⚙️ 第十一章 访问硬件的方法
📄 一句话概括

应用程序几乎不直接碰硬件,中间隔着操作系统和驱动;但也不是完全无关——硬件没有的能力,软件变不出来。

📝 本节和前面几节的关系

第十章看的是 CPU 内部,这一章向外看:CPU 是怎么跟键盘、磁盘、显示器这些外设打交道的。

一、隔在中间的那几层

从你写的代码到真正的硬件,中间站着好几层: 应用程序 调 API(open、read、print)→ 操作系统发出硬件相关命令 → 驱动程序读写端口与寄存器 → 硬件。 每一层都把下面那一层的差异吃掉一点(第九章讲过抽象化)。 所以站在应用层看,硬件好像是【不存在】的——这正是设计者想要的效果。

二、换台机器也能跑

因为隔着这几层,同一份代码换台机器照样跑。 实测本机的几个【硬件相关】数值:操作系统 win32、CPU 架构 AMD64、指针 64 位、字节序 little。 这些值因机器而异,可上面那几行调用一个字都不用改。 换掉的差异,都被驱动和操作系统接住了。

三、什么时候必须关心硬件

只有两类场合,应用层躲不掉: 要一个硬件本来没有的能力——机器没有摄像头,视频通话功能就无从谈起。 要绕开操作系统抢性能——显卡加速、嵌入式开发,直接摸硬件才够快。 除了这两类,应用层完全可以当硬件不存在。 换句话说:不是【程序与硬件无关】,而是【有人替你接住了这件事】。

四、还有一层它接不住

驱动能吸收硬件的型号差异,但有一件事它吸收不了:CPU 的指令集。 这一点第七章讲过(7.2):x86 和 ARM 的本机代码不是同一种语言。 所以【应用程序与硬件无关】这句话有个前提:底层那套指令集是一致的。 跨指令集时,要么重新编译,要么靠虚拟机——这又是另一条路了。

五、动手 Demo:应用程序是否与硬件有关

应用层几乎不直接碰硬件,中间隔着操作系统和驱动。 实测本机几个硬件相关的数值,看这层保护有多彻底。

import platform, struct, sys
print("操作系统", sys.platform)
print("CPU 架构", platform.machine())
print("指针宽度", struct.calcsize("P") * 8)
print("字节序  ", sys.byteorder)

实跑输出:

--------------------------------------------------------------------
应用程序是否与硬件有关
--------------------------------------------------------------------

**应用层几乎不直接碰硬件**——中间隔着操作系统和驱动:

    应用程序
      ↓  调用 API(open/read/print)
    操作系统
      ↓  发出硬件相关命令
    驱动程序
      ↓  读写端口/寄存器
    硬件

  所以同一份代码换台机器照样跑。实测本机的几个【硬件相关】数值:

  项目            本机实测值
  ---------------------------
  操作系统        win32
  CPU 架构        AMD64
  指针宽度        64 位
  字节序          little
  Python 版本     3.13.14

  **这些值因机器而异,但上面那几行调用(open/read/print)一个字都不用改。**
  这就是操作系统和驱动替我们挡住的差异。

  那什么时候【必须】关心硬件?只有两类场合:
    **要一个硬件本来没有的能力**——没有摄像头,视频通话就无从谈起。
    **要绕开操作系统抢性能**——显卡加速、嵌入式,直接摸硬件才够快。
  除了这两类,**应用层完全可以当硬件不存在。**

实测:win32/AMD64/64 位/little——这些值因机器而异。 可上面那几行调用(open/read/print)一个字都不用改——差异被操作系统和驱动接住了。

30 秒实验

  1. 把自己电脑上的这几项打印出来,跟书上或同学的机器比一比。
  2. 想一想:为什么手机 App 搬到电脑上,有些功能就没了。

常见误区

  1. 以为应用层和硬件【完全无关】。它是【有人替你接住了】。
  2. 以为有了驱动就什么都不用管。CPU 指令集的差异它接不住。
自测三问(点开对答案) 1. 应用程序和硬件之间隔着哪几层? —— 应用程序调 API,操作系统发出硬件命令,驱动程序读写端口与寄存器,最后才是硬件。 2. 为什么换台机器程序还能跑? —— 硬件型号的差异被驱动和操作系统接住了,上层调用不用改。 3. 什么时候必须直接关心硬件? —— 两种场合:硬件本来没有的能力做不出来;要绕开操作系统抢性能(显卡加速、嵌入式)。

相关笔记