第 1 部分针对 Oracle Solaris 平台设计设备驱动程序
9. 直接内存访问 (Direct Memory Access, DMA)
14. 分层驱动程序接口 (Layered Driver Interface, LDI)
全存储排序 (Total Store Ordering, TSO)
部分存储排序 (Partial Store Ordering, PSO)
本节介绍特殊设备的问题。
虽然在有了锁定原语所提供的同步和保护机制的情况下可以执行大多数驱动程序操作,但是对于某些设备而言,必须在没有中断的情况下按顺序发生一系列事件。函数 ddi_enter_critical(9F) 与锁定原语一起将请求系统尽可能保证不会抢占或中断当前线程。在进行对 ddi_exit_critical(9F) 的关闭调用之前,此保证将一直有效。有关详细信息,请参见 ddi_enter_critical(9F) 手册页。
许多芯片指定只能在指定间隔对其进行访问。例如, Zilog Z8530 SCC 具有 1.6 微秒的“写入恢复时间”。此规范意味着通过 8530 写入字符时,必须使用 drv_usecwait(9F) 强制延迟。在某些情况下,规范不会明确指示所需的延迟,因此必须根据经验来确定延迟。
请注意不要组合可能大量存在的设备部件的延迟,例如数以千计的 SCSI 磁盘驱动器。
具有内部顺序逻辑的设备会将多个内部寄存器映射到同一外部地址。各种内部顺序逻辑包括以下类型:
Intel 8251A 和 Signetics 2651 可在两个内部模式寄存器之间替换同一外部寄存器。通过向外部寄存器进行写入可实现对第一个内部寄存器的写入。但是,这种写入操作有不利的一面,即要在芯片中设置顺序逻辑,以使下一个读/写操作是在另一个内部寄存器上进行。
NEC PD7201 PCC 具有多个内部数据寄存器。要将字节写入特定寄存器,必须执行两个步骤。第一步是将以下数据字节将进入的寄存器的编号写入寄存器零。然后,将数据写入指定的数据寄存器。顺序逻辑会自动设置芯片,以便发送的下一字节进入数据寄存器零。
AMD 9513 计时器具有一个数据指针寄存器,指向数据字节将进入的数据寄存器。向数据寄存器发送字节时,该指针会递增。无法读取指针寄存器的当前值。
控制器中断不一定会指示控制器及其从属设备之一均已就绪。对于某些控制器,中断可指示控制器或其设备之一已就绪,但不是均已就绪。
并非所有设备都会在禁用中断时打开电源,也不是所有设备都可随时开始中断。
某些设备不提供用于确定板是否已经生成中断的方法。
并非所有中断的板都会在被告知关闭中断时或在总线重置之后关闭中断。