Oracle Solaris DDI/DKI 服务汇总
本附录介绍 Oracle Solaris DDI/DKI 所提供的接口。这些说明并不具有完整性和确定性,也未提供详细的使用指导,而是旨在使用一般术语介绍函数功能。有关更多详细信息,请参见 physio(9F)。介绍的类别如下所示:
模块函数
模块函数包括:
- mod_info
查询可装入模块
- mod_install
添加可装入模块
- mod_remove
删除可装入模块
设备信息树节点 (dev_info_t) 函数
设备信息树节点函数包括:
- ddi_binding_name()
返回驱动程序绑定名称
- ddi_dev_is_sid()
指示设备是否能自我识别
- ddi_driver_major()
返回驱动程序主设备号
- ddi_driver_name()
返回标准化驱动程序名称
- ddi_node_name()
返回 devinfo 节点名称
- ddi_get_devstate()
检查设备状态
- ddi_get_instance()
获取设备实例编号
- ddi_get_name()
返回驱动程序绑定名称
- ddi_get_parent()
查找设备信息结构的父节点
- ddi_root_node()
获取 dev_info 树的根
设备 (dev_t) 函数
设备函数包括:
- ddi_create_minor_node()
为设备创建次要节点
- ddi_getiminor()
从外部 dev_t 中获取内核内部次要设备号
- ddi_remove_minor_node()
删除设备的次要节点
- getmajor()
获取主设备号
- getminor()
获取次要设备号
- makedevice()
根据主设备号和次要设备号生成设备编号
属性函数
属性函数包括:
- ddi_prop_exists()
检查属性是否存在
- ddi_prop_free()
释放属性查找使用的资源
- ddi_prop_get_int()
查找整数属性
- ddi_prop_get_int64()
查找 64 位整数属性
- ddi_prop_lookup_byte_array()
查找字节数组属性
- ddi_prop_lookup_int_array()
查找整数数组属性
- ddi_prop_lookup_int64_array()
查找 64 位整数数组属性
- ddi_prop_lookup_string()
查找字符串属性
- ddi_prop_lookup_string_array()
查找字符串数组属性
- ddi_prop_remove()
删除设备的一个属性
- ddi_prop_remove_all()
删除设备的所有属性
- ddi_prop_undefine()
隐藏设备的一个属性
- ddi_prop_update_byte_array()
创建或更新字节数组属性
- ddi_prop_update_int()
创建或更新整数属性
- ddi_prop_update_int64()
创建或更新 64 位整数属性
- ddi_prop_update_int_array()
创建或更新整数数组属性
- ddi_prop_update_int64_array()
创建或更新 64 位整数数组属性
- ddi_prop_update_string()
创建或更新字符串属性
- ddi_prop_update_string_array()
创建或更新字符串数组属性
表 B-1 过时的属性函数
| |
ddi_getlongprop()
| 请参见 ddi_prop_lookup()
|
ddi_getlongprop_buf()
| ddi_prop_lookup()
|
ddi_getprop()
| ddi_prop_get_int()
|
ddi_getproplen()
| ddi_prop_lookup()
|
ddi_prop_create()
| ddi_prop_lookup()
|
ddi_prop_modify()
| ddi_prop_lookup()
|
ddi_prop_op()
| ddi_prop_lookup()
|
|
设备软件状态函数
设备软件状态函数包括:
- ddi_get_driver_private()
获取设备的专用数据区的地址
- ddi_get_soft_state()
获取指向实例软状态结构的指针
- ddi_set_driver_private()
设置设备的专用数据区的地址
- ddi_soft_state_fini()
销毁驱动程序软状态结构
- ddi_soft_state_free()
释放实例软状态结构
- ddi_soft_state_init()
初始化驱动程序软状态结构
- ddi_soft_state_zalloc()
分配实例软状态结构
内存分配和取消分配函数
内存分配和取消分配函数包括:
- kmem_alloc()
分配内核内存
- kmem_free()
释放内核内存
- kmem_zalloc()
分配零填充的内核内存
以下函数可以分配和释放用于 DMA 的内存。请参见Direct Memory Access (DMA) Functions。
- ddi_dma_mem_alloc()
为 DMA 传送操作分配内存
- ddi_dma_mem_free()
释放以前分配的 DMA 内存
以下函数可以分配和释放用于导出到用户空间的内存。请参见User Space Access Functions。
- ddi_umem_alloc()
分配按页对齐的内核内存
- ddi_umem_free()
释放按页对齐的内核内存
表 B-2 过时的内存分配和取消分配函数
| |
ddi_iopb_alloc()
| ddi_dma_mem_alloc()
|
ddi_iopb_free()
| ddi_dma_mem_free()
|
ddi_mem_alloc()
| ddi_dma_mem_alloc()
|
ddi_mem_free()
| ddi_dma_mem_free()
|
|
内核线程控制和同步函数
内核线程控制和同步函数包括:
- cv_broadcast()
唤醒所有等待线程
- cv_destroy()
释放已分配的条件变量
- cv_init()
分配条件变量
- cv_signal()
唤醒一个等待线程
- cv_timedwait()
等待事件,具有超时设置
- cv_timedwait_sig()
等待事件或信号,具有超时设置
- cv_wait()
等待事件
- cv_wait_sig()
等待事件或信号
- ddi_can_receive_sig()
确定当前线程是否可以接收信号
- ddi_enter_critical()
进入关键控制区
- ddi_exit_critical()
退出关键控制区
- mutex_destroy()
销毁互斥锁
- mutex_enter()
获取互斥锁
- mutex_exit()
释放互斥锁
- mutex_init()
初始化互斥锁
- mutex_owned()
确定当前线程是否持有互斥锁
- mutex_tryenter()
尝试获取互斥锁,但不等待
- rw_destroy()
销毁读取器/写入器锁
- rw_downgrade()
将持有的读取器/写入器锁从写入器降级为读取器
- rw_enter()
获取读取器/写入器锁
- rw_exit()
释放读取器/写入器锁
- rw_init()
初始化读取器/写入器锁
- rw_read_locked()
确定持有的读取器/写入器锁是用于读取还是用于写入
- rw_tryenter()
尝试获取读取器/写入器锁,但不等待
- rw_tryupgrade()
尝试将持有的读取器/写入器锁从读取器升级为写入器
- sema_destroy()
销毁信号
- sema_init()
初始化信号
- sema_p()
递减信号并可能阻塞
- sema_p_sig()
递减信号,但信号待处理时不阻塞
- sema_tryp()
尝试递减信号,但不阻塞
- sema_v()
递增信号并可能解除阻塞等待程序
任务队列管理函数
下面列出了任务队列管理函数。有关这些接口的更多信息,请参见 taskq(9F) 手册页。
- ddi_taskq_create()
创建任务队列
- ddi_taskq_destroy()
销毁任务队列
- ddi_taskq_dispatch()
在任务队列中添加任务
- ddi_taskq_wait()
等待暂挂的任务完成
- ddi_taskq_suspend()
暂挂任务队列
- ddi_taskq_suspended()
检查任务队列是否已暂挂
- ddi_taskq_resume()
恢复暂挂的任务队列
中断函数
中断函数包括:
- ddi_intr_add_handler(9F)
添加中断处理程序。
- ddi_intr_add_softint(9F)
添加软中断处理程序。
- ddi_intr_alloc(9F)
为指定类型的中断分配系统资源和中断向量。
- ddi_intr_block_disable(9F)
禁用指定范围的中断。仅适用于 MSI。
- ddi_intr_block_enable(9F)
启用指定范围的中断。仅适用于 MSI。
- ddi_intr_clr_mask(9F)
如果已启用指定的中断,则清除中断屏蔽码。
- ddi_intr_disable(9F)
禁用指定的中断。
- ddi_intr_dup_handler(9F)
仅适用于 MSI-X。将分配的中断向量的地址和数据对复制到同一设备上未使用的中断向量。
- ddi_intr_enable(9F)
启用指定的中断。
- ddi_intr_free(9F)
针对指定的中断句柄释放系统资源和中断向量。
- ddi_intr_get_cap(9F)
针对指定的中断返回中断功能标志。
- ddi_intr_get_hilevel_pri(9F)
返回高级别中断的最低优先级别。
- ddi_intr_get_navail(9F)
返回可用于特定硬件设备和给定中断类型的中断的数量。
- ddi_intr_get_nintrs(9F)
针对给定的中断类型获取设备支持的中断数。
- ddi_intr_get_pending(9F)
读取中断待处理位(如果主桥 (host bridge) 或设备支持)。
- ddi_intr_get_pri(9F)
返回指定中断的当前软件优先级设置。
- ddi_intr_get_softint_pri(9F)
返回指定中断的软中断优先级。
- ddi_intr_get_supported_types(9F)
返回设备和主机均支持的硬件中断类型。
- ddi_intr_remove_handler(9F)
删除指定的中断处理程序。
- ddi_intr_remove_softint(9F)
删除指定的软中断处理程序。
- ddi_intr_set_cap(9F)
为指定的中断设置 DDI_INTR_FLAG_LEVEL 或 DDI_INTR_FLAG_EDGE 标志。
- ddi_intr_set_mask(9F)
如果已启用指定的中断,则设置中断屏蔽码。
- ddi_intr_set_pri(9F)
设置指定中断的中断优先级别。
- ddi_intr_set_softint_pri(9F)
更改指定软中断的相对软中断优先级。
- ddi_intr_trigger_softint(9F)
触发指定的软中断。
要利用新框架的功能,请使用上述接口。请勿使用下表中列出的过时接口。保留这些过时接口只是出于兼容性目的。
表 B-3 过时的中断函数
| |
ddi_add_intr(9F)
| 包含三个步骤的过程:
|
ddi_add_softintr(9F)
|
|
ddi_dev_nintrs(9F)
|
|
ddi_get_iblock_cookie(9F)
| 包含三个步骤的过程:
|
ddi_get_soft_iblock_cookie(9F)
| 包含三个步骤的过程:
|
ddi_intr_hilevel(9F)
| 包含三个步骤的过程:
|
ddi_remove_intr(9F)
| 包含三个步骤的过程:
|
ddi_remove_softintr(9F)
|
|
ddi_trigger_softintr(9F)
|
|
|
程控 I/O 函数
程控 I/O 函数包括:
- ddi_dev_nregs()
返回设备的寄存器集数
- ddi_dev_regsize()
返回设备寄存器的大小
- ddi_regs_map_setup()
为寄存器地址空间设置映射
- ddi_regs_map_free()
释放以前映射的寄存器地址空间
- ddi_device_copy()
在设备寄存器之间复制数据
- ddi_device_zero()
零填充设备
- ddi_check_acc_handle()
检查数据访问句柄
- ddi_get8()
从映射的内存、设备寄存器或 DMA 内存中读取一个 8 位数据
- ddi_get16()
从映射的内存、设备寄存器或 DMA 内存中读取一个 16 位数据
- ddi_get32()
从映射的内存、设备寄存器或 DMA 内存中读取一个 32 位数据
- ddi_get64()
从映射的内存、设备寄存器或 DMA 内存中读取一个 64 位数据
- ddi_put8()
向映射的内存、设备寄存器或 DMA 内存中写入一个 8 位数据
- ddi_put16()
向映射的内存、设备寄存器或 DMA 内存中写入一个 16 位数据
- ddi_put32()
向映射的内存、设备寄存器或 DMA 内存中写入一个 32 位数据
- ddi_put64()
向映射的内存、设备寄存器或 DMA 内存中写入一个 64 位数据
- ddi_rep_get8()
从映射的内存、设备寄存器或 DMA 内存中读取多个 8 位数据
- ddi_rep_get16()
从映射的内存、设备寄存器或 DMA 内存中读取多个 16 位数据
- ddi_rep_get32()
从映射的内存、设备寄存器或 DMA 内存中读取多个 32 位数据
- ddi_rep_get64()
从映射的内存、设备寄存器或 DMA 内存中读取多个 64 位数据
- ddi_rep_put8()
向映射的内存、设备寄存器或 DMA 内存中写入多个 8 位数据
- ddi_rep_put16()
向映射的内存、设备寄存器或 DMA 内存中写入多个 16 位数据
- ddi_rep_put32()
向映射的内存、设备寄存器或 DMA 内存中写入多个 32 位数据
- ddi_rep_put64()
向映射的内存、设备寄存器或 DMA 内存中写入多个 64 位数据
- ddi_peek8()
从某一位置慎重读取一个 8 位的值
- ddi_peek16()
从某一位置慎重读取一个 16 位的值
- ddi_peek32()
从某一位置慎重读取一个 32 位的值
- ddi_peek64()
从某一位置慎重读取一个 64 位的值
- ddi_poke8()
向某一位置慎重写入一个 8 位的值
- ddi_poke16()
向某一位置慎重写入一个 16 位的值
- ddi_poke32()
向某一位置慎重写入一个 32 位的值
- ddi_poke64()
向某一位置慎重写入一个 64 位的值
可以始终使用上面列出的一般程控 I/O 函数,而不必使用下面的 mem、io 和 pci_config 函数。但如果编译时已知访问类型,以下函数可作为备用函数。
- ddi_io_get8()
从 I/O 空间的映射设备寄存器中读取一个 8 位数据
- ddi_io_get16()
从 I/O 空间的映射设备寄存器中读取一个 16 位数据
- ddi_io_get32()
从 I/O 空间的映射设备寄存器中读取一个 32 位数据
- ddi_io_put8()
向 I/O 空间的映射设备寄存器中写入一个 8 位数据
- ddi_io_put16()
向 I/O 空间的映射设备寄存器中写入一个 16 位数据
- ddi_io_put32()
向 I/O 空间的映射设备寄存器中写入一个 32 位数据
- ddi_io_rep_get8()
从 I/O 空间的映射设备寄存器中读取多个 8 位数据
- ddi_io_rep_get16()
从 I/O 空间的映射设备寄存器中读取多个 16 位数据
- ddi_io_rep_get32()
从 I/O 空间的映射设备寄存器中读取多个 32 位数据
- ddi_io_rep_put8()
向 I/O 空间的映射设备寄存器中写入多个 8 位数据
- ddi_io_rep_put16()
向 I/O 空间的映射设备寄存器中写入多个 16 位数据
- ddi_io_rep_put32()
向 I/O 空间的映射设备寄存器中写入多个 32 位数据
- ddi_mem_get8()
从内存空间的映射设备或 DMA 内存中读取一个 8 位数据
- ddi_mem_get16()
从内存空间的映射设备或 DMA 内存中读取一个 16 位数据
- ddi_mem_get32()
从内存空间的映射设备或 DMA 内存中读取一个 32 位数据
- ddi_mem_get64()
从内存空间的映射设备或 DMA 内存中读取一个 64 位数据
- ddi_mem_put8()
向内存空间的映射设备或 DMA 内存中写入一个 8 位数据
- ddi_mem_put16()
向内存空间的映射设备或 DMA 内存中写入一个 16 位数据
- ddi_mem_put32()
向内存空间的映射设备或 DMA 内存中写入一个 32 位数据
- ddi_mem_put64()
向内存空间的映射设备或 DMA 内存中写入一个 64 位数据
- ddi_mem_rep_get8()
从内存空间的映射设备或 DMA 内存中读取多个 8 位数据
- ddi_mem_rep_get16()
从内存空间的映射设备或 DMA 内存中读取多个 16 位数据
- ddi_mem_rep_get32()
从内存空间的映射设备或 DMA 内存中读取多个 32 位数据
- ddi_mem_rep_get64()
从内存空间的映射设备或 DMA 内存中读取多个 64 位数据
- ddi_mem_rep_put8()
向内存空间的映射设备或 DMA 内存中写入多个 8 位数据
- ddi_mem_rep_put16()
向内存空间的映射设备或 DMA 内存中写入多个 16 位数据
- ddi_mem_rep_put32()
向内存空间的映射设备或 DMA 内存中写入多个 32 位数据
- ddi_mem_rep_put64()
向内存空间的映射设备或 DMA 内存中写入多个 64 位数据
- pci_config_setup()
设置对 PCI 本地总线配置空间的访问
- pci_config_teardown()
销毁对 PCI 本地总线配置空间的访问
- pci_config_get8()
从 PCI 本地总线配置空间中读取一个 8 位数据
- pci_config_get16()
从 PCI 本地总线配置空间中读取一个 16 位数据
- pci_config_get32()
从 PCI 本地总线配置空间中读取一个 32 位数据
- pci_config_get64()
从 PCI 本地总线配置空间中读取一个 64 位数据
- pci_config_put8()
向 PCI 本地总线配置空间中写入一个 8 位数据
- pci_config_put16()
向 PCI 本地总线配置空间中写入一个 16 位数据
- pci_config_put32()
向 PCI 本地总线配置空间中写入一个 32 位数据
- pci_config_put64()
向 PCI 本地总线配置空间中写入一个 64 位数据
表 B-4 过时的程控 I/O 函数
| |
ddi_getb()
| ddi_get8()
|
ddi_getl()
| ddi_get32()
|
ddi_getll()
| ddi_get64()
|
ddi_getw()
| ddi_get16()
|
ddi_io_getb()
| ddi_io_get8()
|
ddi_io_getl()
| ddi_io_get32()
|
ddi_io_getw()
| ddi_io_get16()
|
ddi_io_putb()
| ddi_io_put8()
|
ddi_io_putl()
| ddi_io_put32()
|
ddi_io_putw()
| ddi_io_put16()
|
ddi_io_rep_getb()
| ddi_io_rep_get8()
|
ddi_io_rep_getl()
| ddi_io_rep_get32()
|
ddi_io_rep_getw()
| ddi_io_rep_get16()
|
ddi_io_rep_putb()
| ddi_io_rep_put8()
|
ddi_io_rep_putl()
| ddi_io_rep_put32()
|
ddi_io_rep_putw()
| ddi_io_rep_put16()
|
ddi_map_regs()
| ddi_regs_map_setup()
|
ddi_mem_getb()
| ddi_mem_get8()
|
ddi_mem_getl()
| ddi_mem_get32()
|
ddi_mem_getll()
| ddi_mem_get64()
|
ddi_mem_getw()
| ddi_mem_get16()
|
ddi_mem_putb()
| ddi_mem_put8()
|
ddi_mem_putl()
| ddi_mem_put32()
|
ddi_mem_putll()
| ddi_mem_put64()
|
ddi_mem_putw()
| ddi_mem_put16()
|
ddi_mem_rep_getb()
| ddi_mem_rep_get8()
|
ddi_mem_rep_getl()
| ddi_mem_rep_get32()
|
ddi_mem_rep_getll()
| ddi_mem_rep_get64()
|
ddi_mem_rep_getw()
| ddi_mem_rep_get16()
|
ddi_mem_rep_putb()
| ddi_mem_rep_put8()
|
ddi_mem_rep_putl()
| ddi_mem_rep_put32()
|
ddi_mem_rep_putll()
| ddi_mem_rep_put64()
|
ddi_mem_rep_putw()
| ddi_mem_rep_put16()
|
ddi_peekc()
| ddi_peek8()
|
ddi_peekd()
| ddi_peek64()
|
ddi_peekl()
| ddi_peek32()
|
ddi_peeks()
| ddi_peek16()
|
ddi_pokec()
| ddi_poke8()
|
ddi_poked()
| ddi_poke64()
|
ddi_pokel()
| ddi_poke32()
|
ddi_pokes()
| ddi_poke16()
|
ddi_putb()
| ddi_put8()
|
ddi_putl()
| ddi_put32()
|
ddi_putll()
| ddi_put64()
|
ddi_putw()
| ddi_put16()
|
ddi_rep_getb()
| ddi_rep_get8()
|
ddi_rep_getl()
| ddi_rep_get32()
|
ddi_rep_getll()
| ddi_rep_get64()
|
ddi_rep_getw()
| ddi_rep_get16()
|
ddi_rep_putb()
| ddi_rep_put8()
|
ddi_rep_putl()
| ddi_rep_put32()
|
ddi_rep_putll()
| ddi_rep_put64()
|
ddi_rep_putw()
| ddi_rep_put16()
|
ddi_unmap_regs()
| ddi_regs_map_free()
|
inb()
| ddi_io_get8()
|
inl()
| ddi_io_get32()
|
inw()
| ddi_io_get16()
|
outb()
| ddi_io_put8()
|
outl()
| ddi_io_put32()
|
outw()
| ddi_io_put16()
|
pci_config_getb()
| pci_config_get8()
|
pci_config_getl()
| pci_config_get32()
|
pci_config_getll()
| pci_config_get64()
|
pci_config_getw()
| pci_config_get16()
|
pci_config_putb()
| pci_config_put8()
|
pci_config_putl()
| pci_config_put32()
|
pci_config_putll()
| pci_config_put64()
|
pci_config_putw()
| pci_config_put16()
|
repinsb()
| ddi_io_rep_get8()
|
repinsd()
| ddi_io_rep_get32()
|
repinsw()
| ddi_io_rep_get16()
|
repoutsb()
| ddi_io_rep_put8()
|
repoutsd()
| ddi_io_rep_put32()
|
repoutsw()
| ddi_io_rep_put16()
|
|
直接内存访问 (Direct Memory Access, DMA) 函数
DMA 函数包括:
- ddi_dma_alloc_handle()
分配 DMA 句柄
- ddi_dma_free_handle()
释放 DMA 句柄
- ddi_dma_mem_alloc()
为 DMA 传送操作分配内存
- ddi_dma_mem_free()
释放以前分配的 DMA 内存
- ddi_dma_addr_bind_handle()
将地址绑定到 DMA 句柄
- ddi_dma_buf_bind_handle()
将系统缓冲区绑定到 DMA 句柄
- ddi_dma_unbind_handle()
取消绑定 DMA 句柄中的地址
- ddi_dma_nextcookie()
检索后续的 DMA cookie
- ddi_dma_getwin()
激活新 DMA 窗口
- ddi_dma_numwin()
检索 DMA 窗口数
- ddi_dma_sync()
同步 CPU 和 I/O 内存视图
- ddi_check_dma_handle()
检查 DMA 句柄
- ddi_dma_set_sbus64()
允许在 S 总线上进行 64 位传送
- ddi_slaveonly()
报告设备是否安装在只允许从属访问的位置
- ddi_iomin()
查找 DMA 的最小对齐和传送大小
- ddi_dma_burstsizes()
查找 DMA 映射的允许突发大小
- ddi_dma_devalign()
查找 DMA 映射对齐和最小传送大小
- ddi_dmae_alloc()
获取 DMA 通道
- ddi_dmae_release()
释放 DMA 通道
- ddi_dmae_getattr()
获取 DMA 引擎属性
- ddi_dmae_prog()
对 DMA 通道编程
- ddi_dmae_stop()
终止 DMA 引擎操作
- ddi_dmae_disable()
禁用 DMA 通道
- ddi_dmae_enable()
启用 DMA 通道
- ddi_dmae_getcnt()
获取剩余的 DMA 引擎计数
- ddi_dmae_1stparty()
配置 DMA 通道层叠模式
- ddi_dma_coff()
将 DMA cookie 转换为 DMA 句柄内的偏移
表 B-5 过时的直接内存访问 (Direct Memory Access, DMA) 函数
| |
ddi_dma_addr_setup()
| ddi_dma_alloc_handle()、ddi_dma_addr_bind_handle()
|
ddi_dma_buf_setup()
| ddi_dma_alloc_handle()、ddi_dma_buf_bind_handle()
|
ddi_dma_curwin()
| ddi_dma_getwin()
|
ddi_dma_free()
| ddi_dma_free_handle()
|
ddi_dma_htoc()
| ddi_dma_addr_bind_handle()、ddi_dma_buf_bind_handle()
|
ddi_dma_movwin()
| ddi_dma_getwin()
|
ddi_dma_nextseg()
| ddi_dma_nextcookie()
|
ddi_dma_segtocookie()
| ddi_dma_nextcookie()
|
ddi_dma_setup()
| ddi_dma_alloc_handle()、ddi_dma_addr_bind_handle()、ddi_dma_buf_bind_handle()
|
ddi_dmae_getlim()
| ddi_dmae_getattr()
|
ddi_iopb_alloc()
| ddi_dma_mem_alloc()
|
ddi_iopb_free()
| ddi_dma_mem_free()
|
ddi_mem_alloc()
| ddi_dma_mem_alloc()
|
ddi_mem_free()
| ddi_dma_mem_free()
|
hat_getkpfnum()
| ddi_dma_addr_bind_handle()、ddi_dma_buf_bind_handle()、ddi_dma_nextcookie()
|
|
用户空间访问函数
用户空间访问函数包括:
- ddi_copyin()
将数据复制到驱动程序缓冲区
- ddi_copyout()
从驱动程序中复制数据
- uiomove()
使用 uio 结构复制内核数据
- ureadc()
向 uio 结构中添加字符
- uwritec()
从 uio 结构中删除字符
- getminor()
获取次要设备号
- ddi_model_convert_from()
确定数据模型类型是否不匹配
- IOC_CONVERT_FROM()
确定是否需要转换 M_IOCTL 内容
- STRUCT_DECL()
声明并初始化指向本机形式结构实例的结构句柄
- STRUCT_HANDLE()
声明并初始化指向本机形式结构实例的结构句柄
- STRUCT_INIT()
声明并初始化指向本机形式结构实例的结构句柄
- STRUCT_SET_HANDLE()
声明并初始化指向本机形式结构实例的结构句柄
- SIZEOF_PTR()
返回指定数据模型中指针的大小
- SIZEOF_STRUCT()
返回指定数据模型中结构的大小
- STRUCT_SIZE()
返回应用程序数据模型中结构的大小
- STRUCT_BUF()
返回指向结构的本机模式实例的指针
- STRUCT_FADDR()
返回指向结构的指定字段的指针
- STRUCT_FGET()
返回应用程序数据模型中结构的指定字段
- STRUCT_FGETP()
返回应用程序数据模型中结构的指定指针字段
- STRUCT_FSET()
设置应用程序数据模型中结构的指定字段
- STRUCT_FSETP()
设置应用程序数据模型中结构的指定指针字段
表 B-6 过时的用户空间访问函数
| |
copyin()
| ddi_copyin()
|
copyout()
| ddi_copyout()
|
ddi_getminor()
| getminor()
|
|
用户进程事件函数
用户进程事件函数包括:
- pollwakeup()
通知进程事件已发生
- proc_ref()
获取进程中指向信号的句柄
- proc_unref()
释放进程中指向信号的句柄
- proc_signal()
向进程发送信号
用户进程信息函数
用户进程信息函数包括:
- ddi_get_cred()
返回指向调用方的凭证结构的指针
- drv_priv()
确定进程凭证权限
- ddi_get_pid()
返回进程 ID
表 B-7 过时的用户进程信息函数
| |
drv_getparm()
| ddi_get_pid()、ddi_get_cred()
|
|
用户应用程序内核和设备访问函数
用户应用程序内核和设备访问函数包括:
- ddi_dev_nregs()
返回设备的寄存器集数
- ddi_dev_regsize()
返回设备寄存器的大小
- ddi_devmap_segmap()、devmap_setup()
使用 devmap 框架设置用户与设备内存之间的映射
- devmap_devmem_setup()
将设备内存导出到用户空间
- devmap_load()
验证内存地址转换
- devmap_unload()
使内存地址转换无效
- devmap_do_ctxmgt()
对映射执行设备上下文切换
- devmap_set_ctx_timeout()
为上下文管理回叫设置超时值
- devmap_default_access()
缺省驱动程序内存访问函数
- ddi_umem_alloc()
分配按页对齐的内核内存
- ddi_umem_free()
释放按页对齐的内核内存
- ddi_umem_lock()
锁定内存页
- ddi_umem_unlock()
解除锁定内存页
- ddi_umem_iosetup()
设置对应用程序内存的 I/O 请求
- devmap_umem_setup()
将内核内存导出到用户空间
- ddi_model_convert_from()
确定数据模型类型是否不匹配
表 B-8 过时的用户应用程序内核和设备访问函数
| |
ddi_mapdev()
| devmap_setup()
|
ddi_mapdev_intercept()
| devmap_load()
|
ddi_mapdev_nointercept()
| devmap_unload()
|
ddi_mapdev_set_device_acc_attr()
| devmap()
|
ddi_segmap()
| devmap()
|
ddi_segmap_setup()
| devmap_setup()
|
hat_getkpfnum()
| devmap()
|
ddi_mmap_get_model()
| devmap()
|
|
与时间有关的函数
与时间有关的函数包括:
- ddi_get_lbolt()
返回自重新引导以来的时钟周期数
- ddi_get_time()
返回当前时间(秒)
- ddi_periodic_add()
以纳秒为周期发出超时请求
- ddi_periodic_delete()
取消以纳秒为周期发出超时请求
- delay()
使执行延迟指定的时钟周期数
- drv_hztousec()
将时钟周期转换为微秒
- drv_usectohz()
将微秒转换为时钟周期
- drv_usecwait()
繁忙-等待指定的时间间隔
- gethrtime()
获取高分辨率时间
- gethrvtime()
获取高分辨率 LWP 虚拟时间
- timeout()
在指定的时间长度后执行函数
- untimeout()
取消以前的超时函数调用
- drv_getparm()
ddi_get_lbolt()、ddi_get_time()
表 B-9 过时的与时间有关的函数
| |
drv_getparm()
| ddi_get_lbolt()、ddi_get_time()
|
|
电源管理函数
电源管理函数包括:
- ddi_removing_power()
使用 DDI_SUSPEND 检查设备是否断电
- pci_report_pmcap()
报告 PCI 设备的电源管理功能
- pm_busy_component()
将组件标记为繁忙
- pm_idle_component()
将组件标记为空闲
- pm_raise_power()
提高组件的电源级别
- pm_lower_power()
降低组件的电源级别
- pm_power_has_changed()
向电源管理框架通知有关自治电源级别的更改信息
- pm_trans_check()
设备电源开关建议检查
表 B-10 过时的电源管理函数
| |
ddi_dev_is_needed()
| 通知系统需要某一设备组件
|
pm_create_components()
| 创建可管理电源的组件
|
pm_destroy_components()
| 销毁可管理电源的组件
|
pm_get_normal_power()
| 获取设备组件的正常电源级别
|
pm_set_normal_power()
| 设置设备组件的正常电源级别
|
|
故障管理函数
故障管理函数包括:
- ddi_fm_init()
根据声明的故障管理功能分配和初始化资源
- ddi_fm_fini()
清除为该设备实例分配的资源,以支持声明为 ddi_fm_init() 的故障管理功能
- ddi_fm_capable()
返回当前为该设备实例设置的功能位掩码
- ddi_fm_handler_register()
在 IO 故障管理框架中注册错误处理程序回调例程
- ddi_fm_handler_unregister()
删除使用 ddi_fm_handler_register() 注册的错误处理程序回调例程
- ddi_fm_acc_err_get()
返回访问句柄的错误状态
- ddi_fm_dma_err_get()
返回 DMA 句柄的错误状态
- ddi_fm_acc_err_clear()
清除访问句柄的错误状态
- ddi_fm_dma_err_clear()
清除 DMA 句柄的错误状态
- ddi_fm_ereport_post()
将编码的故障管理错误报告名称-值对列表排入队列,以传送到 Fault Manager 守护进程 fmd(1M) 中
- ddi_fm_service_impact()
报告错误的影响
- pci_ereport_setup()
初始化错误报告生成支持,并设置对 PCI、PCI/X 或 PCI Express 配置空间进行后续访问所用的资源
- pci_ereport_teardown()
释放 pci_ereport_setup() 为该设备实例分配和设置的所有资源
- pci_ereport_post()
扫描和发布任何 PCI、PCI/X 或 PCI Express 总线错误
内核统计信息函数
内核统计信息 (kstat) 函数包括:
- kstat_create()
创建并初始化新的 kstat
- kstat_delete()
从系统中删除 kstat
- kstat_install()
向系统中添加完全初始化的 kstat
- kstat_named_init()
初始化已命名的 kstat
- kstat_runq_back_to_waitq()
记录从运行队列到等待队列的事务迁移
- kstat_runq_enter()
记录向运行队列中添加的事务
- kstat_runq_exit()
记录从运行队列中移除的事务
- kstat_waitq_enter()
记录向等待队列中添加的事务
- kstat_waitq_exit()
记录从等待队列中移除的事务
- kstat_waitq_to_runq()
记录从等待队列到运行队列的事务迁移
内核日志记录和列显函数
内核日志记录和列显函数包括:
- cmn_err()、vcmn_err()
显示错误消息
- ddi_report_dev()
通知设备
- strlog()
将消息提交至日志驱动程序
- ddi_dev_report_fault()
报告硬件故障
- scsi_errmsg()
显示 SCSI 请求检测消息
- scsi_log()
显示与 SCSI 设备有关的消息
- scsi_vu_errmsg()
显示 SCSI 请求检测消息
缓存 I/O 函数
缓存 I/O 函数包括:
- physio()
执行物理 I/O
- aphysio()
执行异步物理 I/O
- anocancel()
禁止取消异步 I/O 请求
- minphys()
限制 physio() 缓冲区大小
- biowait()
暂停以待处理方式完成块 I/O 的进程
- biodone()
在完成缓冲区 I/O 传送后释放缓冲区并通知阻塞的线程
- bioerror()
指示缓冲区头中的错误
- geterror()
返回 I/O 错误
- bp_mapin()
分配虚拟地址空间
- bp_mapout()
取消分配虚拟地址空间
- disksort()
使用单向电梯查找策略对缓冲区排序
- getrbuf()
获取原始缓冲区头
- freerbuf()
释放原始缓冲区头
- biosize()
返回缓冲区结构的大小
- bioinit()
初始化缓冲区结构
- biofini()
取消初始化缓冲区结构
- bioreset()
在 I/O 完成后重用专用的缓冲区头
- bioclone()
克隆另一个缓冲区
- biomodified()
检查缓冲区是否已修改
- clrbuf()
删除缓冲区的内容
虚拟内存函数
虚拟内存函数包括:
- ddi_btop()
将设备字节转换为页(向下舍入)
- ddi_btopr()
将设备字节转换为页(向上舍入)
- ddi_ptob()
将设备页转换为字节
- btop()
将以字节表示的大小转换为以页表示的大小(向下舍入)
- btopr()
将以字节表示的大小转换为以页表示的大小(向上舍入)
- ptob()
将以页表示的大小转换为以字节表示的大小
表 B-11 过时的虚拟内存函数
| |
hat_getkpfnum()
| devmap()、ddi_dma_*_bind_handle()、ddi_dma_nextcookie()
|
|
设备 ID 函数
设备 ID 函数包括:
- ddi_devid_init()
分配设备 ID 结构
- ddi_devid_free()
释放设备 ID 结构
- ddi_devid_register()
注册设备 ID
- ddi_devid_unregister()
注销设备 ID
- ddi_devid_compare()
比较两个设备 ID
- ddi_devid_sizeof()
返回设备 ID 的大小
- ddi_devid_valid()
验证设备 ID
- ddi_devid_str_encode()
将设备 ID 和 minor_name 编码为以 null 结尾的 ASCII 字符串,返回指向该字符串的指针
- ddi_devid_str_decode()
从以前编码的字符串中解码设备 ID 和 minor_name,分配并返回指向提取部分的指针
- ddi_devid_str_free()
释放 ddi_devid_* 函数返回的所有字符串
SCSI 函数
SCSI 函数包括:
- scsi_probe()
探测 SCSI 设备
- scsi_unprobe()
释放在初始探测期间分配的资源
- scsi_alloc_consistent_buf()
为 SCSI DMA 分配 I/O 缓冲区
- scsi_free_consistent_buf()
释放以前分配的 SCSI DMA I/O 缓冲区
- scsi_init_pkt()
准备完整的 SCSI 包
- scsi_destroy_pkt()
释放已分配的 SCSI 包及其 DMA 资源
- scsi_setup_cdb()
设置 SCSI 命令描述符块 (command descriptor block, CDB)
- scsi_transport()
启动 SCSI 命令
- scsi_poll()
运行轮询 SCSI 命令
- scsi_ifgetcap()
获取 SCSI 传输功能
- scsi_ifsetcap()
设置 SCSI 传输功能
- scsi_sync_pkt()
同步 CPU 和 I/O 内存视图
- scsi_abort()
中止 SCSI 命令
- scsi_reset()
重置 SCSI 总线或目标
- scsi_reset_notify()
向目标驱动程序通知总线重置
- scsi_cname()
解码 SCSI 命令
- scsi_dname()
解码 SCSI 外围设备类型
- scsi_mname()
解码 SCSI 消息
- scsi_rname()
解码 SCSI 包完成原因
- scsi_sname()
解码 SCSI 感知密钥
- scsi_errmsg()
显示 SCSI 请求检测消息
- scsi_log()
显示与 SCSI 设备有关的消息
- scsi_vu_errmsg()
显示 SCSI 请求检测消息
- scsi_hba_init()
SCSI HBA 系统初始化例程
- scsi_hba_fini()
SCSI HBA 系统完成例程
- scsi_hba_attach_setup()
SCSI HBA 连接例程
- scsi_hba_detach()
SCSI HBA 分离例程
- scsi_hba_probe()
缺省 SCSI HBA 探测函数
- scsi_hba_tran_alloc()
分配传输结构
- scsi_hba_tran_free()
释放传输结构
- scsi_hba_pkt_alloc()
分配 scsi_pkt 结构
- scsi_hba_pkt_free()
释放 scsi_pkt 结构
- scsi_hba_lookup_capstr()
返回索引匹配功能字符串
表 B-12 过时的 SCSI 函数
| |
free_pktiopb()
| scsi_free_consistent_buf()
|
get_pktiopbs()
| scsi_alloc_consistent_buf()
|
makecom_g0()
| scsi_setup_cdb()
|
makecom_g0_s()
| scsi_setup_cdb()
|
makecom_g1()
| scsi_setup_cdb()
|
makecom_g5()
| scsi_setup_cdb()
|
scsi_dmafree()
| scsi_destroy_pkt()
|
scsi_dmaget()
| scsi_init_pkt()
|
scsi_hba_attach()
| scsi_hba_attach_setup()
|
scsi_pktalloc()
| scsi_init_pkt()
|
scsi_pktfree()
| scsi_destroy_pkt()
|
scsi_resalloc()
| scsi_init_pkt()
|
scsi_resfree()
| scsi_destroy_pkt()
|
scsi_slave()
| scsi_probe()
|
scsi_unslave()
| scsi_unprobe()
|
|
资源映射管理函数
资源映射管理函数包括:
- rmallocmap()
分配资源映射
- rmallocmap_wait()
分配资源映射,必要时等待
- rmfreemap()
释放资源映射
- rmalloc()
从资源映射中分配空间
- rmalloc_wait()
从资源映射中分配空间,必要时等待
- rmfree()
将空间重新释放到资源映射中
系统全局状态
- ddi_in_panic()
确定系统是否处于紧急状态
实用程序函数
以下列表提供了可用的实用程序函数的一个子集。
- nulldev()
零返回函数
- nodev()
错误返回函数
- nochpoll()
不可轮询设备的错误返回函数
- ASSERT()
表达式验证
- bcopy()
在内核的地址位置之间复制数据
- bzero()
清除给定字节数的内存
- bcmp()
比较两个字节数组
- ddi_ffs()
查找长整数中设置的第一位
- ddi_fls()
查找长整数中设置的最后一位
- swab()
以 16 位半字交换字节
- strcat()
附加两个字符串
- strncat()
附加两个字符串,有长度限制
- strlcat()
附加两个字符串,有长度和缓冲区限制
- strcmp()
比较两个以 null 结尾的字符串
- strncmp()
比较两个以 null 结尾的字符串,长度有限制
- strlen()
确定字符串中的非空字节数
- strnlen()
确定字符串中的非空字节数,有长度限制
- strcpy()
将字符串从一个位置复制到另一个位置
- strncpy()
将字符串从一个位置复制到另一个位置,长度有限制
- strlcpy()
将字符串从一个位置复制到另一个位置(有长度和缓冲区限制)
- strcasecmp()
strcmp() 的不区分大小写的版本
- strncasecmp()
strncmp() 的不区分大小写的版本
- strchr()
在字符串中查找字符
- strstr()
定位一个字符串在另一个字符串中第一次出现的位置
- strcasestr()
strstr() 的不区分大小写的版本
- strfree()
释放与字符串关联的内存
- sprintf()、vsprintf()
格式化内存中的字符
- snprintf()
以指定的缓冲区大小格式化内存中的字符
- numtos()
将整数转换为十进制字符串
- stoi()
将十进制字符串转换为整数
- max()
返回两个整数中的较大值
- min()
返回两个整数中的较小值
- va_arg()
查找变量参数列表中的下一个值
- va_copy()
复制变量参数列表的状态
- va_end()
删除指向变量参数列表的指针
- va_start()
查找指向变量参数列表开头的指针
有关实用程序函数的详细信息,请参见man pages section 9: DDI and DKI Kernel Functions 。