i_disable 内核服务
用途
禁用中断优先级。
语法
#include <sys/types.h>
#include <sys/errno.h>
#include <sys/intr.h> int i_disable ( new)
int new;
int new;
参数
| 项 | 描述 |
|---|---|
| 新建 | 指定新的中断优先级。 |
描述
注意: i_disable 服务具有两个副作用,这些副作用是由内核的可替换和可分页性质产生的。 第一,防止进程调度。 其次,它在限制范围内确保调用者的堆栈在内存中。 当中断优先级不等于 INTBASE 时发生的缺页故障导致系统崩溃。
注: i_disable 服务与标准的 UNIX 斯普尔 服务非常相似。
i_disable 服务将中断优先级设置为更优先的中断优先级。 中断优先级用于控制哪些中断是允许的。
值 INTMAX 是最优先的优先级,并禁用所有中断。 值 INTBASE 是最不受青睐的值,并且仅禁用未使用的中断。 /usr/include/sys/intr.h 文件定义有效的中断优先级。
中断优先级仅更改为对在多个环境 (即,进程和中断环境) 中执行的代码进行序列化。
例如,在调用过程下执行时,设备驱动程序通常会链接列表中的请求。 设备驱动程序的中断处理程序通常使用此列表来启动下一个请求。 因此,设备驱动程序必须使用设备中断来序列化更新此列表。 i_disable 和 i_enable 服务提供此功能。 I_init 内核服务包含中断处理程序的简短描述。
注: 在多处理器安全内核扩展中对此类代码进行序列化时,必须使用锁定和中断控制。 出于此原因,新代码应该调用 disable_lock 内核服务而不是 i_disable。 disable_lock 服务仅在多处理器系统上执行锁定,并帮助确保代码在单处理器和多处理器系统之间可移植。
必须始终将 i_disable 服务与 i_enable 服务配合使用。 例程必须始终返回,并将中断优先级恢复为它在输入时具有的值。
当例程必须在返回时禁用其设备时,可以使用 i_mask 服务。
由于这些副作用, i_disable 服务的调用者应该确保:
- 引用参数已置顶。
- 在禁用操作期间执行的代码已置顶。
- 在禁用操作期间所使用的堆栈量小于 1KB。
- 被调用程序使用少于 1KB 个堆栈。
通常, i_disable 服务的调用者还应仅调用可以由中断处理程序调用的服务。 但是,调用 i_disable 服务的流程可以调用 睡眠, 等待, 埃斯莱普勒, 洛克勒和 解锁 服务,只要事件词或锁定词被置顶。
内核的第一级中断处理程序在调用中断处理程序之前设置中断处理程序的中断优先级。 进程的中断优先级在进程创建时设置为 INTBASE ,并且是每个进程的状态的一部分。 分派器将中断优先级设置为与要执行的进程相关联的值。
执行环境
返回值
i_disable 服务返回当前中断优先级,该优先级随后将与 i_enable 服务一起使用。