テクニカル ドキュメント #21



Doc ID: 21
製品: WinDriver
Version:  --

リソースを 'Shared' に設定することには、どんな意味があるのでしょうか。この 'Shared' ステータスがカードのリソースに設定されているかどうかを確認するにはどうしたらよいでしょうか。

"Shared" ステータスにより、リソースが排他的にロックされるかどうかを決めています。

メモリ、I/O、割り込み、これらの項目は非共有とされており、デバイス登録用関数
  WDC_PciDeviceOpen()
  WDC_PcmiaDeviceOpen()
  WDC_IsaDeviceOpen()
は、リソースが既にロックされているのかどうかをチェックしています。既にロックされている場合は、デバイスの登録は失敗しますが、そうでない場合は、排他的にロックします。その後にリソースをロックしようとしても、失敗します。同じアプリ内からでも、他の WinDriver アプリからでもこれは同様で、下記関数で開放しない限り失敗します。
  WDC_PciDeviceClose()
  WDC_PcmiaDeviceClose()
  WDC_IsaDeviceClose()
(デバイスのレジスタは、共有設定にはできません)

PCI リソース、特に割り込みは、共有設定にしなくてはならないことが通常よくありますので、ご留意ください。

メモリおよび I/O の場合、WinDriver で定義された share (共有) ステータスは、WinDriver ベースのアプリケーションにのみ影響します。
ただし、割り込みの場合、他のドライバ (WinDriver ベースのドライバに限らず) が同じ割り込みをロックできるかどうか、割り込みステータスも決めるので、より重要性があります。 PCI 割り込みステータスのレジスタの値を読み込む方法に関しては、テクニカル ドキュメント #104 を参照してください。

リソースを共有可能として定義したかをチェックするには、次の方法で確認できます:

コードから、カード上のメモリ/IO/割り込みアイテムの fNotSharable フラグの値をプリントします (WDC API では deviceInfo.Card.Item[i].fNotSharable、または低レベル WinDriver API では cardReg.Card.Item[i].fNotSharable を使用)。
その値が 1 の場合、リソースは共有不可です。
その値が 0 の場合、リソースは共有可能です。

一般的な指針として、リソースの二重ロックは避けてください。再度ロックする場合は、前にロックしたリソースを開放してからにしてください。(同じアプリ内からでも、他の WinDriver アプリからでもこれは同様です) 複数アプリケーションから同じリソースへアクセスしたい場合には、デバイス登録用関数
  WDC_PciDeviceOpen()
  WDC_PcmiaDeviceOpen()
  WDC_IsaDeviceOpen()
を一度コールして、その得られたハンドルを共有してください。詳細は テクニカル ドキュメント #98 を参照してください。