![]() |
|
通过认识 Microsoft Windows? 和 Linux? 操作系统设备控制的工作原理,本文将简化从 Microsoft Windows? 向 Linux? 迁移设备控制应用程序。作者分析二者的差别,并给出 C/C++ 示例。
如果读者开发过不同平台的设备控制应用程序,那么肯定了解 Windows 和 Linux 的设备控制方式的差别,从一个平台向另一个平台迁移应用程序相当复杂。本文分析两种操作系统的设备控制原理,探究从架构到系统调用的各个方面,重点比较二者差别。本文还给出一个迁移示例(用 C/C++ 编写),详细演示迁移过程。
工作条件:
根据本文的写作目的,“Windows” 是指 Windows 2000 或其后续版本,且安装有 Microsoft Visual C++? 6.0 或其后续版本。Linux应当基于 2.6 版内核,且安装有 GNU GCC。
比较设备控制的架构
Windows 和 Linux 设备控制的方式是不同的。
Windows 设备控制架构
Windows 的 I/O 子系统将用户应用程序和设备驱动程序联系起来,并定义基础结构支持设备驱动程序。设备驱动程序为具体设备提供 I/O 接口。
在设备控制过程中,I/O 操作封装为 IRP(I/O 请求数据包)。I/O 管理器创建 IRP,并将它发送到堆栈顶部。然后,设备驱动程序获取 IRP 的堆栈地址。IRP 包含着 I/O 请求的参数。根据 IRP 包含的请求(比如 创建、 读取、写入、设备 I/O 控制、清除 或 关闭),各驱动程序通过硬件接口工作。
Linux 设备控制架构
Linux 的设备控制架构有所不同。主要区别是,Linux 的普通文件、目录、设备和 socket 都是文件 —Linux 的所有东西都是文件。为了访问设备,Linux 内核将设备操作调用通过文件系统映射到设备驱动程序。Linux 没有 I/O 管理器。所有 I/O 请求从开始就进入文件系统。
比较设备文件名和路径名
从开发的角度来看,获取设备句柄是设备控制的先决条件。但是,由于设备控制架构的差异,获取设备句柄会根据所用平台不同(Windows 还是 Linux)而有不同的过程。
一般而言,设备句柄由具体设备驱动程序的名称决定。
Windows 设备驱动程序的文件名不同于普通文件,通常称为设备路径名。它具有固定格式,形如 \.DeviceName。在 C/C++ 编程中,这个字符串应当是 \\.\DeviceName。在代码中表示为 \\\\.\\DeviceName。DeviceName 应当与相应设备驱动程序定义的设备名称相同。
有些设备名称由 Microsoft 定义,因此不能修改(如表 1 所示)。
表 1. Windows 设备名称(x = 0,1,2 等)
设备 路径名
软盘驱动器 A: B:
硬盘逻辑子区 C: D: E: . . .
物理驱动器 PhysicalDrivex
CD-ROM、DVD/ROM CdRomx
磁带驱动器 Tapex
COM 端口 COMx
例如,我们在 C/C++ 编程中使用设备路径名,比如 \\\\.\\PhysicalDrive1、\\\\.\\CdRom0 和 \\\\.\\Tape0。 关于这个列表未收录的其他设备的详细情况,请查看本文后面的 参考资料 小节。
因为 Linux 将设备描述为文件,所以可以在目录 ./dev 中找到所有设备文件。这个目录的设备驱动程序包括:
IDE(Integrated Drive Electronics)硬盘驱动器,比如 /dev/hda 和 /dev/hdb
CD-ROM 驱动器,有些是 IDE;也有些是模拟 SCSI(Small Computer Systems Interface)设备的 CD-RW(CD 读/写)驱动器,比如 /dev/scd0
串行口,例如 /dev/ttyS0 表示 COM1,/dev/ttyS1 表示 COM2,依此类推
定位设备,包括 /dev/input/mice 等
打印机,比如 /dev/lp0
常见设备文件大多可以按照上述描述找到。有关其他设备文件名和设备的详细信息,请使用命令 dmesg。
比较主系统调用
设备控制的主系统调用包括下列操作:打开、关闭、I/O 控制、读/写等。参见表 2 所示的 Windows/Linux 映射。 转贴于:Linux认证考试_考试大