编写设备驱动程序

修改处理数据共享的例程

如果设备驱动程序使用 ioctl(9E)devmap(9E)mmap(9E) 与 32 位应用程序共享包含 long 或指针类型的数据结构,而驱动程序已针对 64 位内核进行了重新编译,则数据结构的二进制布局将不兼容。 如果当前已按 long 类型定义了字段,并且未使用 64 位数据项,请更改数据结构,以使用仍为 32 位的数据类型(intunsigned int)。否则,驱动程序需要识别 ILP32 和 LP64 的不同结构形式,并确定应用程序与内核之间是否出现模型不匹配。

要处理潜在的数据模型差异,需要编写可直接与用户应用程序交互的 ioctl()devmap()mmap() 驱动程序入口点,以确定参数是否来自使用与内核具有相同数据模型的应用程序。

ioctl() 中的数据共享

要确定应用程序与驱动程序之间是否存在模型不匹配,驱动程序可使用 FMODELS 掩码确定 ioctl () mode 参数的模型类型。在 mode 中采用以下值之一来标识应用程序的数据模型:

对有 64 位处理能力的设备驱动程序的 I/O 控制支持中的代码示例说明如 何使用 ddi_model_convert_from(9F) 处理此情况。

devmap() 中的数据共享

要使 64 位驱动程序和 32 位应用程序共享内存,64 位驱动程序生成的二进制布局必须与 32 位应用程序使用的布局相同。要导出到应用程序的映射内存可能需要包含与数据模型有关的数据结构。

很少内存映射设备会面临此问题,因为在内核数据模型发生变化时设备寄存器不会改变大小。但是,一些将映射导出到用户地址空间的伪设备可能要将不同数据结构导出到 ILP32 或 LP64 应用程序。要确定是否出现了数据模型不匹配,devmap(9E) 可使用 model 参数说明应用程序期望的数据模型。model 参数被设置为以下值之一:

可将未经转换的模型参数传递到 ddi_model_convert_from(9F) 例程或 STRUCT_INIT()。请参见32 位和 64 位数据结构宏

mmap() 中的数据共享

由于 mmap(9E) 没有可用于传递数据模型信息的参数,因此可编写驱动程序的 mmap(9E) 入口点,以使用新的 DDI 函数 ddi_model_convert_from(9F)。此函数返回以下值之一,以指示应用程序的数据类型模型:

ioctl()devmap() 一样,可将模型位传递到 ddi_model_convert_from(9F) 以确定是否需要进行数据转换,或可将模型传递到 STRUCT_INIT()

或者,迁移设备驱动程序以支持 devmap(9E) 入口点。