i_init 内核服务
用途
定义中断处理程序。
语法
#include <sys/types.h>
#include <sys/errno.h>
#include <sys/intr.h>
参数
| 项 | 描述 |
|---|---|
| 处理程序 (handler) | 指定固定中断处理程序结构的地址。 |
描述
注意: 在对 i_init 服务进行调用以定义中断处理程序与对 清除 服务进行调用以除去中断处理程序之间,不得更改中断处理程序结构。 结构也必须保持固定。 如果该结构在这些时候被改变,可能会导致内核恐慌。
i_init 服务允许设备驱动程序定义到内核的中断处理程序。 处理程序 参数指向的中断处理程序 因特尔 结构描述了该中断处理程序。 i_init 服务的调用者必须对 因特尔 结构中的所有字段进行初始化。 /usr/include/sys/intr.h 文件定义这些字段及其有效值。
i_init 服务通过将中断处理程序结构链接到为该总线级别定义的中断处理程序列表的末尾来启用中断。 如果这是指定总线中断级别的第一个中断处理程序,那么 i_init 服务将通过调用 i_unmask 服务来启用总线中断级别。
如果满足以下两个条件,那么可以在 i_init 服务返回之前调用中断处理程序:
- i_init 服务的调用者正在以低于为该中断定义的中断优先级的中断优先级执行。
- 设备或同一总线中断级别上的另一设备的中断已处于暂挂状态。
在多处理器系统上,缺省情况下使用 i_init 内核服务定义的所有中断处理程序都在系统引导时启动的第一个处理器上运行。 这确保与单处理器中断处理程序兼容。 如果正在定义的中断处理程序已设计为多处理器安全,或者为 EPOW (早期断电警告) 或非级别中断处理程序,请在以下位置设置 INTR_MPSAFE 标志:flags传递到 i_init 内核服务的 因特尔 结构的字段。 然后,中断处理程序将在任何可用的处理器上运行。
对中断处理程序进行编码
当在该总线中断级别上发生启用的中断时,内核调用中断处理程序。 中断处理程序负责确定该中断是否来自它自己的设备并处理该中断。 到中断处理程序的接口如下所示:
国际 中断处理程序 (处理程序) struct intr *处理程序;
处理程序 参数指向在对 i_init 内核服务的调用中指定的相同中断处理程序结构。 设备驱动程序可以通过将中断处理程序结构声明为包含这些参数的较大结构的一部分来将其他参数传递给它的中断处理程序。
中断处理程序可以返回两个返回值中的一个。 值为 INTR_SUCC 表示中断处理程序处理了中断并重置了中断设备。 值为 INTR_FAIL 表示中断不是来自此中断处理程序的设备。
注册 "早期断电警告" (EPOW) 例程
还可以使用 i_init 内核服务来注册 EPOW (早期断电警告) 通知例程。
来自 EPOW 中断处理程序的返回值应该为 INTR_SUCC,这指示已成功处理该中断。 当指示 EPOW 中断时,将调用所有已注册的 EPOW 中断处理程序。
执行环境
i_init 内核服务只能从 流程 环境中进行调用。
返回值
| 项 | 描述 |
|---|---|
| INTR_SUCC | 指示成功完成。 |
| INTR_FAIL | 指示未成功完成。 i_init 服务未定义该中断处理程序。 当共享总线中断级别与非共享总线中断级别之间发生冲突时,将发生不成功的完成。 当对总线中断级别指定多个中断优先级时,也会发生不成功的完成。 |