编写设备驱动程序

字节存储顺序

为了实现多平台、多指令集体系结构可移植性的目标,驱动程序中删除了主机总线的相关组件。要解决的第一个相关性问题是处理器的字节存储顺序,即字节排序。例如, x86 处理器系列采用小端字节序,而 SPARC 体系结构采用大端字节序。

总线体系结构显示了与处理器相同类型的字节存储顺序。例如,PCI 局部总线采用小端字节序,S 总线采用大端字节序,ISA 总线采用小端字节序等。

要维持处理器与总线之间的可移植性, DDI 兼容驱动程序必须不采用任何端字节序。虽然驱动程序可以通过运行时检查或源代码中的预处理程序指令(如 #ifdef _LITTLE_ENDIAN) 管理其字节存储顺序,但是长期维护可能会很麻烦。在某些情况下,DDI 框架会使用软件方法来执行字节交换。在另外一些情况下,可以像内存管理单元 (memory management unit, MMU) 中那样通过硬件页级交换来执行字节交换,也可通过特殊计算机指令来执行字节交换。DDI 框架可以利用这些硬件功能来提高性能。

图 A–1 主机总线相关性所需的字节排序

图中显示反向字节存储顺序的字节交换。

除了不采用任何端字节排序之外,可移植驱动程序还必须独立于处理器的数据排序。在大多数情况下,必须按照驱动程序指示的顺序进行数据传送。但是,有时可以通过合并、批处理或者重新排列数据来简化数据传送,如下图中所示。例如,可以将数据合并应用于加速帧缓存器上的图形显示。驱动程序可以选择建议 DDI 框架在数据传送过程中使用其他最优传送机制。

图 A–2 数据排序主机总线相关性

图中显示通过 CPU 重新排列字节。