首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

IBM AIX 设备驱动程序开发 -2

IBM AIX 设备驱动程序开发 -2

驱动程序入口点驱动程序入口点就是 struct devsw 结构的成员。在将设备添加到设备交换表之前,必须初始化所有这些成员。并没有强制设备驱动程序实现所有方法。未实现的成员可以被初始化为 nodev。这些入口点可以接受 dev_no(此操作被定向到的设备或子设备的设备编号)、chan(多路复用设备的通道 ID)、ext(整数,用于调用扩展子例程,如 openx、readx、writex 和 ioctlx,将额外的设备特定的参数传递给少数设备入口点。)
清单 1. 1) ddconfig 或 d_config:
1
int d_config(dev_t dev_no, int cmd, struct uio *uiop)




它的调用由 sysconfig() 系统调用负责。它让设备为其第一次  open() 调用做好准备。它可以初始化、终止、请求设备的配置数据,或执行设备特定的配置函数。uio 结构包含配置信息数据区域。
清单 2. 2) ddopen 或 d_open:
1
int d_open(dev_t dev_no, ulong flag, chan_t chan, ext_t ext)




它支持设备操作并准备好进行数据传输。它分配内部缓冲并执行策略,基于当前的设备状态确定设备的打开方式。由 open() 或 create() 系统调用,以及 fp_open() 或 fp_opendev() 内核服务来调用它。输入参数标志指定打开文件控制标志,如 DREAD、DWRITE,等等。
清单 3. 3) ddclose 或 d_close:
1
int d_close(dev_t dev_no, chan_t chan)




它关闭之前打开的设备实例。它由 close() 系统调用或 fp_close() 内核服务来调用它。在 d_close() 返回给调用程序后,即使返回的是一个非零返回代码,设备实例也被认为是关闭的。
清单 4. 4) ddread 或 d_read:
1
int d_read(dev_t devno, struct uio *uiop, chan_t chan, int ext)




它从一个字符设备读取数据。它由系统调用(如 read() 或 readx())和 fp_rwuio() 内核服务调用它。这里,uio 结构描述要被写入的一个或多个数据区域。
清单 5. 5) ddwrite 或 d_write:
1
int d_write (dev_t devno, struct uio *uiop, chan_t chan, int ext)




它将数据写入一个字符设备。它由系统调用(如 write() 或 writex())和 fp_rwuio() 内核服务调用它。这里,uio 结构描述要被写入的数据所来自的一个或多个数据区域。
清单 6. 6) ddioctl 或 d_ioctl:
1
int d_ioctl(dev_t devno, int cmd, void *arg, ulong devflag, chan_t chan, int ext)




它执行在 ioctl() 或 ioctlx() 系统调用或 fp_ioctl() 内核服务中所请求的特殊 I/O 控制操作。它必须响应 IOCINFO 命令,该命令返回描述设备的 devinfo 结构。
清单 7. 7) ddstrategy 或 d_strategy:
1
int d_strategy(struct buf* buffer)




它执行面向块的 I/O,调度对块设备的读取或写入。它将 I/O 请求映射到设备请求,从而以最少设备请求实现最大量的数据传输。缓冲区是一个指针,指向一个与 b_forw 指针链接的缓冲结构的链接列表。ddstrategy 例程可以接收含多个 buf 结构的请求。然而,不要求以任何特定顺序处理请求。该例程从不返回一个返回代码,也从不等待 I/O 完成。
清单 8. 8) ddselect 或 d_select:
1
int d_select(dev_t devno, ushort events, ushort *reventp,  int chan)




它检查由 events 标志指定的发生在给定设备上的一个或多个事件,并返回一个指针,指向在 reventp 中发生的事件。它的调用由 select 和 poll 系统调用或 fp_select  内核服务负责。  
清单 9. 9) d_mpx 或 ddmpx:
1
int d_mpx(dev_t devno, chan_t* chanp, char* channame)




它为多路复用设备执行逻辑信道的分配和取消分配。它在 d_open 调用之前针对设备文件的每一个 open() 调用一次,以分配一个通道,并且在 d_close 之后为设备文件的每一个关闭调用一次。只有字符类设备驱动程序支持它。chanp 是指向通道 ID 的一个指针, channame 是被分配的通道的路径名称扩展。
清单 10. 10) d_revoke 或 ddrevoke:
1
int d_revoke (dev_t devno, chan_t chan, int flag)




对于需要可信计算路径的设备的驱动程序,ddrevoke() 提供了一个到达终端的安全路径。只有字符类设备驱动程序支持它。它被 revoke() 系统调用或 frevoke() 内核 API 调用。     
清单 11. 11) d_dump 或 dddump:
1
int d_dump(dev_t devno, struct uio * uiop, int cmd, int arg, chan_t chan, int ext)




它将系统转储数据写入到设备。这是设备驱动程序的一个可选例程。只有当设备驱动程序支持设备作为一个可能的内核转储的目标时才需要它。此例程不得调用可以产生页错误的任何内核服务。
返回列表