devmap(9E) 入口点通过 segmap(9E) 入口点内部的 ddi_devmap_segmap(9F) 函数调用。
devmap(9E) 入口点是作为 mmap(2) 系统调用的结果调用的。调用 devmap(9E) 函数可将设备内存或内核内存导出到用户应用程序。devmap() 函数用于进行以下操作:
验证用户到设备内存或内核内存的映射
将应用程序映射中的逻辑偏移转换为设备或内核内存中的对应偏移
将映射信息传递给系统以设置映射
devmap() 函数的语法如下所示:
int devmap(dev_t dev, devmap_cookie_t handle, offset_t off, size_t len, size_t *maplen, uint_t model);
其中:
要映射其内存的设备。
系统创建的设备映射句柄,用来描述到设备或内核中的连续内存的映射。
应用程序映射中的逻辑偏移,必须通过驱动程序将其转换为设备或内核内存中的对应偏移。
所映射的内存的长度(以字节为单位)。
使驱动程序可将不同的内核内存区域或多个物理上不连续的内存区域与一个连续的用户应用程序映射相关联。
当前线程的数据模型类型。
系统在一次 mmap(2) 系统调用中将创建多个映射句柄。例如,映射可能包含多个物理上不连续的内存区域。
devmap(9E) 的首次调用使用参数 off 和 len 的初始值。应用程序将这些参数传递给 mmap(2)。devmap(9E) 将 *maplen 设置为从 off 到连续内存区域结尾之间的长度。*maplen 值必须向上进位为页面大小的倍数。 *maplen 值可被设置为小于原始映射长度 len。如果这样,系统将使用调整了 off 和 len 参数的新映射句柄反复调用 devmap(9E),直到达到初始映射长度为止。
如果一个驱动程序支持多个应用程序数据模型,则必须将 model 传递给 ddi_model_convert_from(9F)。ddi_model_convert_from() 函数可以确定当前线程与设备驱动程序之间是否存在数据模型不匹配的情况。设备驱动程序可能必须调整数据结构的形状,然后才能将结构导出到支持不同数据模型的用户线程。有关更多详细信息,请参见附录 C。
如果逻辑偏移 off 超出了驱动程序导出的内存范围,则 devmap(9E) 入口点必将返回 -1。