第 1 部分针对 Oracle Solaris 平台设计设备驱动程序
9. 直接内存访问 (Direct Memory Access, DMA)
14. 分层驱动程序接口 (Layered Driver Interface, LDI)
磁盘设备是一类重要的块设备驱动程序。
Oracle Solaris 磁盘驱动程序至少需要支持一组特定于 Oracle Solaris 磁盘驱动程序的 ioctl 命令。在 dkio(7I) 手册页中指定了这些 I/O 控制。磁盘 I/O 控制用于将磁盘信息传入/传出设备驱动程序。磁盘实用程序命令(如 format(1M) 和 newfs(1M))支持 Oracle Solaris 磁盘设备。强制性的 Sun 磁盘 I/O 控制如下:
返回描述磁盘控制器的信息
返回磁盘的分区映射
设置磁盘的分区映射
返回磁盘的几何参数
设置磁盘的几何参数
返回磁盘的卷目录
设置磁盘的卷目录
Oracle Solaris DDI/DKI 提供了优化 I/O 传输以提高文件系统性能的工具。它是一种管理 I/O 请求列表以便优化文件系统磁盘访问的机制。有关对 I/O 请求进行排队的说明,请参见异步数据传输(块驱动程序)。
diskhd 结构用于管理 I/O 请求链接表。
struct diskhd { long b_flags; /* not used, needed for consistency*/ struct buf *b_forw, *b_back; /* queue of unit queues */ struct buf *av_forw, *av_back; /* queue of bufs for this unit */ long b_bcount; /* active flag */ };
diskhd 数据结构具有驱动程序可处理的两个 buf 指针。av_forw 指针指向第一个活动 I/O 请求。第二个指针 av_back 指向列表中的上一个活动请求。
一个指向此结构的指针以及一个指向要处理的当前 buf 结构的指针作为参数传递给 disksort(9F)。disksort() 例程对 buf 请求排序以优化磁盘查找。然后此例程将 buf 指针插入 diskhd 列表。disksort() 程序将 buf 结构的 b_resid 中的值用作排序关键字。驱动程序负责设置此值。大多数 Sun 磁盘驱动程序使用柱面组作为排序关键字。此方法优化了文件系统读前访问。
将数据添加到 diskhd 列表后,设备需要传输这些数据。如果设备未忙于处理请求,则 xxstart() 例程会将第一个 buf 结构拉出 diskhd 列表并开始传输。
如果设备正忙,则驱动程序会从 xxstrategy() 入口点返回。当硬件执行完数据传输时,便会产生中断。随后会调用驱动程序的中断例程为设备提供服务。在提供中断服务后,驱动程序可以调用 start() 例程来处理 diskhd 列表中的下一个 buf 结构。