编写设备驱动程序

附录 B Solaris DDI/DKI 服务汇总

本附录介绍了 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) 函数

ddi_dma_mem_alloc()

为 DMA 传送操作分配内存

ddi_dma_mem_free()

释放以前分配的 DMA 内存

以下函数可以分配和释放用于导出到用户空间的内存。请参见用户空间访问函数

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)

包含三个步骤的过程: 

  1. ddi_intr_alloc(9F)

  2. ddi_intr_add_handler(9F)

  3. ddi_intr_enable(9F)

ddi_add_softintr(9F)

ddi_intr_add_softint(9F)

ddi_dev_nintrs(9F)

ddi_intr_get_nintrs(9F)

ddi_get_iblock_cookie(9F)

包含三个步骤的过程: 

  1. ddi_intr_alloc(9F)

  2. ddi_intr_get_pri(9F)

  3. ddi_intr_free(9F)

ddi_get_soft_iblock_cookie(9F)

包含三个步骤的过程: 

  1. ddi_intr_add_softint(9F)

  2. ddi_intr_get_softint_pri(9F)

  3. ddi_intr_remove_softint(9F)

ddi_intr_hilevel(9F)

包含三个步骤的过程: 

  1. ddi_intr_alloc(9F)

  2. ddi_intr_get_hilevel_pri(9F)

  3. ddi_intr_free(9F)

ddi_remove_intr(9F)

包含三个步骤的过程: 

  1. ddi_intr_disable(9F)

  2. ddi_intr_remove_handler(9F)

  3. ddi_intr_free(9F)

ddi_remove_softintr(9F)

ddi_intr_remove_softint(9F)

ddi_trigger_softintr(9F)

ddi_intr_trigger_softint(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 函数,而不必使用下面的 memiopci_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_pktiopb()

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 位半字交换字节

strcmp()

比较两个以 null 结尾的字符串

strncmp()

比较两个以 null 结尾的字符串,长度有限制

strlen()

确定字符串中的非空字节数

strcpy()

将字符串从一个位置复制到另一个位置

strncpy()

将字符串从一个位置复制到另一个位置,长度有限制

strchr()

在字符串中查找字符

sprintf()vsprintf()

格式化内存中的字符

numtos()

将整数转换为十进制字符串

stoi()

将十进制字符串转换为整数

max()

返回两个整数中的较大值

min()

返回两个整数中的较小值

va_arg()

查找变量参数列表中的下一个值

va_copy()

复制变量参数列表的状态

va_end()

删除指向变量参数列表的指针

va_start()

查找指向变量参数列表开头的指针