> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/4.3-bsd-unix-cao-zuo-xi-tong-she-ji-yu-shi-xian/di-san-bu-fen-io-xi-tong/8.1.-gai-shu.md).

# 8.1 概述

硬件设备（hardware device）是磁盘机、磁带机、终端多路复用器或网络控制器之类的外设。UNIX 支持的每种硬件设备都需要一个称为设备驱动（device driver）的软件模块。设备驱动向五花八门的硬件设备提供一致的接口，把设备特有的细节对 UNIX 内核的其余部分和用户应用程序隐藏起来。

UNIX 提供三种设备驱动可以支持的内部接口，允许设备以三种不同方式使用：作为适合存放一个或多个文件系统的面向块的设备；作为可供网络通信的面向消息的信道；或作为可能适合终端 I/O 系统使用的无结构设备。一个设备驱动可以向系统提供这些接口的任意组合，多数只提供一种，也有一些提供多种。本章考察 UNIX 如何支持硬件设备，以及设备驱动如何在 I/O 系统的框架内运作。处理硬件设备的网络相关方面与联网设施一起在第 11 章讨论。

计算机通过配套的外设 I/O 设备存取数据。这些设备通常包括动臂磁盘机、磁带机和网络接口等大容量存储设备。磁盘和磁带等存储设备经 I/O 控制器访问；控制器按 CPU 的 I/O 请求管理其从属（slave）设备的运作。

4.3BSD 支持的 VAX 机器上，多数外设接在 UNIBUS 或 MASSBUS 上；这些总线再经总线适配器连到 VAX 的主系统总线。UNIBUS 和 MASSBUS 是较老的总线，最初为 PDP-11 计算机设计。DEC 在最初的 VAX 机器上用通往这些总线的总线适配器提供硬件向后兼容，让顾客升级硬件系统的同时继续使用既有外设。

I/O 设备经 CPU 物理地址空间中的内存位置访问——也就是说，VAX 采用存储映射 I/O 体系结构。由于 UNIX 内核在启用存储管理的情况下运行，硬件设备对应的物理地址必须映射进内核的虚拟地址空间。

除了映射 I/O 设备所在的内存位置，系统还必须准备接收设备的 **中断** 并调用适当的设备驱动软件 **服务** 中断。所有 UNIBUS 和 MASSBUS I/O 设备都用向量中断（vectored interrupt）：设备需要中断 CPU 时，随中断请求一起发送一个中断向量。中断请求被受理时，中断向量用来索引中断向量表，取出处理该中断的中断服务例程的地址。机器上出现的每种 I/O 设备，UNIX 都必须初始化中断向量表中的相应表项。后面会看到，设备驱动的中断服务例程并不直接从中断向量表调用；UNIX 在中间插入一小层代码，保存机器状态并为设备驱动建立上下文（context），上下文包括中断设备的身份。

UNIX 下，应用程序不能直接访问多数 I/O 设备；系统在设备与应用之间插入一层或多层软件，促成同类设备上统一的接口。例如，磁盘机通常只能经文件系统访问，网络接口控制器只能经第 10 章描述的进程间通信设施使用。但有些场合用户应用需要直接、或几乎直接地访问 I/O 设备。这类场合，UNIX 经由块和字符特殊设备文件支持两种标准硬件设备接口。经块（字符）设备特殊文件访问的设备称为块设备（字符设备），或称具有块设备接口（字符设备接口）。

块设备接口顾名思义只支持面向块的 I/O 操作。块设备接口使用缓冲缓存来减少真正需要 I/O 操作的请求数，并与同一设备上的文件系统操作同步。所有 I/O 都是对内核地址空间中的 I/O 缓冲进行的。这一做法意味着满足一次用户请求至少要做一次内存到内存的复制，但也让 UNIX 能支持几乎任意大小和对齐的 I/O 请求。

字符设备接口有两种形态，取决于底层硬件设备的特性。对终端多路复用器这类面向字符的硬件设备，接口是真正的面向字符的——尽管终端驱动等高层软件可以向应用提供面向行的接口。而对磁盘和磁带这类面向块的设备，字符设备接口实际上是一种非常 **无结构** 的裸（raw）接口：I/O 操作不经缓冲缓存，直接在设备与应用虚拟地址空间中的缓冲之间进行。因此操作的大小必须是设备所要求 **块大小** 的整数倍，某些机器上应用的 I/O 缓冲还必须按适当边界对齐。

系统内部，I/O 设备经每种设备的设备驱动提供的一组固定入口点访问。入口点集合因 I/O 设备支持块设备接口还是字符设备接口而异。块设备接口的设备驱动由 `bdevsw` 结构描述，字符设备接口则经 `cdevsw` 结构访问。所有 `bdevsw` 结构汇集在块设备表中，`cdevsw` 结构同样组织在字符设备表中。

设备由主设备号和次设备号构成的设备号标识。主设备号唯一标识设备类型（实际是设备驱动），是该设备在块设备表或字符设备表中表项的下标。同时支持块、字符两种接口的设备有两个主设备号，每张表一个。次设备号完全由设备驱动解释，用来在可能众多的硬件设备中指明 I/O 请求指向的对象。例如磁带的次设备号用来标识具体的控制器和磁带机；次设备号也可以指定设备的某一部分，如多路复用设备的一条信道，或可选的处理参数。

本章余下部分描述设备驱动的结构与运作。下一节考察设备驱动的一般结构，讨论 I/O 系统与设备驱动共享的数据结构；随后考虑设备驱动与自动配置设施的互动；最后讨论 UNIBUS 和 MASSBUS 上硬件设备的设备驱动运作。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://book.bsdcn.org/4.3-bsd-unix-cao-zuo-xi-tong-she-ji-yu-shi-xian/di-san-bu-fen-io-xi-tong/8.1.-gai-shu.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
