对于仅需支持 32 位内核的驱动程序,现有 32 位设备驱动程序将仍然有效,无需重新编译。但是,大多数设备驱动程序需要进行一些更改才能在 64 位内核中正确运行,且所有设备驱动程序都需要重新编译以创建 64 位驱动程序模块。本附录中的信息旨在指导您利用通用源代码来生成 32 位和 64 位环境的驱动程序,从而提高代码可移植性并降低维护工作量。
开始修改设备驱动程序以便使用 64 位环境之前,应了解 32 位环境与 64 位环境之间的区别。特别是必须熟悉 C 语言数据类型模型 ILP32 和 LP64。请参见下表。
表 C–1 ILP32 与 LP64 数据类型对比
C 类型 |
ILP32 |
LP64 |
---|---|---|
char |
8 |
8 |
short |
16 |
16 |
int |
32 |
32 |
long |
32 |
64 |
long long |
64 |
64 |
float |
32 |
32 |
double |
64 |
64 |
long double |
96 |
128 |
pointer |
32 |
64 |
因 ILP32 与 LP64 之间的差异而导致的特定于驱动程序的问题是本附录的主题。更多常规主题将在《Solaris(64 位)开发者指南》中进行介绍。
除了清理常规代码以支持 LP64 的数据模型更改,驱动程序编写人员还必须提供对 32 位和 64 位应用程序的支持。
ioctl(9E)、devmap(9E) 和 mmap(9E) 入口点使应用程序和设备驱动程序之间可直接共享数据结构。如果这些数据结构在 32 位环境与 64 位环境中的大小不同,则必须修改入口点,以便驱动程序可确定应用程序的数据模型与内核的数据模型是否相同。如果数据模型不同,则可对数据结构进行调整。请参见对有 64 位处理能力的设备驱动程序的 I/O 控制支持、32 位和 64 位数据结构宏和将内核内存与用户映射相关联。
在许多驱动程序中,只有少量 ioctl 需要这种处理。其他 ioctl 无需更改即可应用,只要这些 ioctl 传递的数据结构大小不变。