第 1 部分针对 Oracle Solaris 平台设计设备驱动程序
9. 直接内存访问 (Direct Memory Access, DMA)
14. 分层驱动程序接口 (Layered Driver Interface, LDI)
全存储排序 (Total Store Ordering, TSO)
部分存储排序 (Partial Store Ordering, PSO)
为了实现多平台、多指令集体系结构可移植性的目标,驱动程序中删除了主机总线的相关组件。要解决的第一个相关性问题是处理器的字节存储顺序,即字节排序。例如, x86 处理器系列采用小尾数法,而 SPARC 体系结构采用大尾数法。
总线体系结构显示了与处理器相同类型的字节存储顺序。例如,PCI 局部总线采用小尾数法,S 总线采用大尾数法,ISA 总线采用小尾数法等。
为保持处理器与总线之间的可移植性,符合 DDI 标准的驱动程序不得采用任何端字节序。虽然驱动程序可以通过运行时检查或源代码中的预处理程序指令(如 #ifdef _LITTLE_ENDIAN)管理其字节存储顺序,但是长期维护可能会有问题。在某些情况下,DDI 框架会使用软件方法来执行字节交换。在另外一些情况下,可以像内存管理单元 (memory management unit, MMU) 中那样通过硬件页级交换来执行字节交换,也可通过特殊计算机指令来执行字节交换。DDI 框架可以利用这些硬件功能来提高性能。
图 A-1 主机总线相关性所需的字节排序
除了不采用任何端字节排序之外,可移植驱动程序还必须独立于处理器的数据排序。在大多数情况下,必须按照驱动程序指示的顺序进行数据传送。但是,有时可以通过合并、批处理或者重新排列数据来简化数据传送,如下图中所示。例如,可以将数据合并应用于加速帧缓存器上的图形显示。驱动程序可以选择建议 DDI 框架在数据传送过程中使用其他最优传送机制。
图 A-2 数据排序主机总线相关性