第 1 部分针对 Oracle Solaris 平台设计设备驱动程序
9. 直接内存访问 (Direct Memory Access, DMA)
14. 分层驱动程序接口 (Layered Driver Interface, LDI)
全存储排序 (Total Store Ordering, TSO)
部分存储排序 (Partial Store Ordering, PSO)
本节介绍了许多特定于 SPARC 处理器的主题,如数据对齐、字节排序、寄存器窗口以及浮点指令的可用性。有关特定于 x86 处理器主题的信息,请参见x86 处理器问题。
注 - 驱动程序决不能执行浮点操作,因为内核中不支持这些操作。
所有数量均必须使用标准 C 数据类型与其自然边界对齐:
short 整数在 16 位边界上对齐。
int 整数在 32 位边界上对齐。
long 整数在 SPARC 系统的 64 位边界上对齐。有关数据模型的信息,请参见附录 C。
long long 整数在 64 位边界上对齐。
通常,编译器会处理所有对齐问题。但是,驱动程序编写者可能更关心对齐,因为只有使用正确的数据类型才能访问设备。由于设备寄存器通常是通过指针引用来访问的,因此驱动程序必须确保在访问设备时正确对齐指针。
由于 SPARC 处理器强加的数据对齐限制,因此,C 结构也具有对齐要求。结构对齐要求是由最严格对齐的结构组件强加的。例如,仅包含字符的结构没有对齐限制,而对于包含 long long 成员的结构,则必须对其结构进行设置,保证此成员在 64 位边界上对齐。
SPARC 处理器使用大尾数法进行字节排序。整数的最高有效字节 (most significant byte, MSB) 存储在该整数的最低地址上。最低有效字节存储在此处理器中字的最高地址上。例如,字节 63 是 64 位处理器的最低有效字节。
SPARC 处理器使用寄存器窗口。每个寄存器窗口包含八个输入寄存器、八个局部寄存器、八个输出寄存器以及八个全局寄存器。输出寄存器是下一个窗口的输入寄存器。寄存器窗口的数量范围从 2 到 32,具体取决于处理器实现。
由于驱动程序通常是使用 C 语言编写的,因此编译器通常不会指明使用了寄存器窗口这一事实。但是,当调试驱动程序时,可能必须使用寄存器窗口。
版本 7 SPARC 处理器没有乘法或除法指令。 乘法和除法指令是在软件中模拟实现的。由于驱动程序可能在版本 7、版本 8 或者版本 9 处理器中运行,因此请避免进行大量整数乘除。相反,请使用按位向左和向右移位来以 2 的幂进行相乘和相除。
《SPARC Architecture Manual, Version 9》介绍了有关 SPARC CPU 的更具体信息。《SPARC Compliance Definition》(版本 2.4)介绍了 SPARC V9 的应用程序二进制接口 (application binary interface, ABI) 的详细信息。本手册介绍了 32 位 SPARC V8 ABI 和 64 位 SPARC V9 ABI。可以从 SPARC International 的网站 http://www.sparc.com 上获取本文档。