i_disable カーネル・サービス

目的

割り込み優先順位を無効にします。

構文

#include <sys/types.h>
#include <sys/errno.h>
#include <sys/intr.h>
int i_disable ( new)
int new;

パラメーター

項目 説明
NEW 新しい割り込み優先順位を指定します。

説明

注意: i_disable サービスには、カーネルの置き換え可能かつページング可能な性質から生じる 2 つの副次作用があります。 まず、プロセス・ディスパッチングを防止します。 2 番目に、呼び出し元のスタックがメモリー内にあることを制限内で確認します。 割り込み優先順位がシステムの INT ベース クラッシュと等しくないときに発生するページ不在。

注: i_disable サービスは、標準の UNIX SPL サービスとよく似ています。

i_disable サービスは、割り込み優先順位をより優先された割り込み優先順位に設定します。 割り込み優先順位は、どの割り込みを許可するかを制御するために使用されます。

最大 INTMAX の値は最も優先される優先順位であり、すべての割り込みを使用不可にします。 値 INT ベース は最も優先度が低く、使用されていない割り込みのみを使用不可にします。 /usr/include/sys/intr.h ファイルは、有効な割り込み優先順位を定義します。

割り込み優先順位は、複数の環境 (つまり、プロセス環境および割り込み環境) で実行されるコードをシリアライズするためにのみ変更されます。

例えば、デバイス・ドライバーは通常、呼び出しプロセスの下で実行中に、リスト内の要求をリンクします。 デバイス・ドライバーの割り込みハンドラーは通常、このリストを使用して次の要求を開始します。 したがって、デバイス・ドライバーは、デバイス割り込みを使用してこのリストの更新をシリアライズする必要があります。 i_disable および i_enable サービスは、この機能を提供します。 イ_初期化 カーネル・サービスには、割り込みハンドラーの簡単な説明が含まれています。

注: マルチプロセッサー・セーフ・カーネル・エクステンションでこのようなコードをシリアライズする場合は、割り込み制御と同様にロックを使用する必要があります。 このため、新しいコードでは、 i_disableの代わりに 使用不可ロック カーネル・サービスを呼び出す必要があります。 使用不可ロック サービスは、マルチプロセッサー・システムでのみロックを実行し、ユニプロセッサー・システムとマルチプロセッサー・システムの間でコードを移植できるようにします。

i_disable サービスは、常に i_enable サービスと一緒に使用する必要があります。 ルーチンは常に、入り口での値に復元された割り込み優先順位で戻る必要があります。

マスク サービスは、ルーチンが戻り時にその装置を使用不可にする必要がある場合に使用できます。

これらの副次作用のため、 i_disable サービスの呼び出し側は、以下のことを確認する必要があります。

  • 参照パラメーターは固定されています。
  • 無効化操作中に実行されたコードはピン留めされます。
  • 無効化操作中に使用されたスタックの量が 1KBを下回っています。
  • 呼び出し先プログラムが使用するスタックは 1KB 未満です。

一般に、 i_disable サービスの呼び出し側は、割り込みハンドラーによって呼び出すことができるサービスのみを呼び出す必要があります。 ただし、 i_disable サービスを呼び出すプロセスは、イベント・ワードまたはロックワードが固定されている限り、 スリープ待機スリープルロック、および アンロック の各サービスを呼び出すことができます。

カーネルの第 1 レベル割り込みハンドラーは、割り込みハンドラーを呼び出す前に、割り込みハンドラーの割り込み優先順位を設定します。 プロセスの割り込み優先順位は、プロセスの作成時に INT ベース に設定され、各プロセスの状態の一部になります。 ディスパッチャーは、割り込み優先順位を、実行するプロセスに関連した値に設定します。

実行環境

i_disable カーネル・サービスは、 処理 環境または 割り込み 環境のいずれかから呼び出すことができます。

戻り値

i_disable サービスは、 i_enable サービスで後で使用される現在の割り込み優先順位を返します。