20. 设备和驱动程序
输入输出设备 Everything is a File 在 Unix-like 系统中,与外部设备交互的核心思想是 Everything is a File 文件描述符 (File Descriptor):操作系统为上层软件提供了一个统一的抽象,即文件描述符,它是一个指向内核中任何 I/O 对象的“指针”或句柄 统一接口:无论是普通文件、硬件设备(如终端、磁盘)、还是网络连接,都可以通过 open 获得一个文件描述符,然后使用相同的 read/write 等系统调用来进行操作,这极大地简化了应用程序的编写 设备控制器与 MMIO “文件”这个美好的抽象背后,是具体的硬件工作原理 设备控制器 (Device Controller):每个 I/O 设备都有一个控制器,它是一个包含 CPU、内存和寄存器的微型计算机,作为 CPU 和物理设备之间的桥梁 设备寄存器:控制器通过一组寄存器与 CPU 通信,通常包括: 状态寄存器:用于表示设备当前是否繁忙、是否准备好等 指令寄存器:CPU 写入指令,告诉设备要做什么 数据寄存器:用于在 CPU 和设备之间传输数据 内存映射 I/O (MMIO):为了让 CPU 能访问这些寄存器,现代系统普遍采用 MMIO (Memory-Mapped I/O),操作系统会将设备的寄存器映射到物理内存地址空间中的特定区域,这样一来,CPU 就可以像访问普通内存一样,使用标准的 load/store 指令来读写设备寄存器,从而实现对设备的控制 GPIO GPIO (General-Purpose Input/Output) 是理解 I/O 设备原理最直观的例子,GPIO 就是一个物理引脚,可以通过编程设置为输入或输出模式 通过 MMIO,一个 GPIO 引脚的电平状态被映射到一个特定的内存地址,当 CPU 向这个地址写入 1 时,引脚就变为高电平;写入 0 时,则变为低电平,这个过程将一条内存写指令直接转化为了一个物理世界的动作(比如点亮一个 LED) ...