Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

デバイスの問題

このセクションでは、特殊なデバイスの問題について説明します。

タイミングクリティカルセクション

ほとんどのドライバの処理は、ロックプリミティブによって提供されるものを超える同期や保護のメカニズムなしで実行できますが、一部のデバイスでは一連のイベントが割り込みなしで順番に発生する必要があります。ロックプリミティブに関連して、関数 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 は、2 つの内部モードレジスタの間で同じ外部レジスタを交互に使用します。最初の内部レジスタへの書き込みは、外部レジスタへの書き込みによって完成します。ただし、この書き込みには、チップの順序付けロジックが設定され、次の読み取り/書き込み処理で 2 番目の内部レジスタを参照するという想定外の結果が伴います。

  • NEC PD7201 PCC には、複数の内部データレジスタがあります。特定のレジスタにバイトを書き込むには、2 つの手順を実行する必要があります。最初の手順は、後続のデータバイトが入るレジスタの番号をレジスタ 0 に書き込むことです。次に、データは、指定されたデータレジスタに書き込まれます。順序付けロジックによって、次に送信されるバイトがデータレジスタ 0 に入るようにチップが自動的に設定されます。

  • AMD 9513 タイマーには、データバイトが入るデータレジスタをポイントするデータポインタレジスタがあります。データレジスタにバイトを送信すると、ポインタは増分されます。ポインタレジスタの現在の値を読み取ることはできません

割り込みの問題

割り込みに関係した次の一般的な問題に注意してください。

  • コントローラによる割り込みは、必ずしもコントローラそのスレーブデバイスの 1 つの両方の準備ができたことを示すものではありません。一部のコントローラでは、割り込みは、両方の準備ができたことではなく、コントローラの準備ができたか、またはそのデバイスの 1 つの準備ができたかのいずれかを示すことがあります。

  • 割り込みを無効にしてもすべてのデバイスのパフォーマンスが向上するわけではありません。また、すべてのデバイスが任意の時点で割り込みを開始できるわけでもありません。

  • 一部のデバイスでは、ボードが割り込みを生成したことを判定する方法が用意されていません。

  • 割り込みを停止するように指示されたときに、またはバスがリセットされたあとで、すべての割り込みボードが割り込みを停止するわけではありません。