![]() |
![]() |
日本−日本語 | ![]() |
|
|
![]() |
![]() |
HP OpenVMS Alpha: パーティショニングおよび Galaxy ガイド![]() 第19章 OpenVMS Galaxy デバイス・ドライバ |
|
![]() |
目次 この章では,OpenVMS Alpha バージョン 7.3 で PCI ドライバに対しての ダイレクト・マップ DMA ウィンドウについて説明します。 この節で説明する変更は OpenVMS Galaxy とメモリ・ホールをサポートするために OpneVMS バージョン 7.2 で変更されたものです。 この変更では,ダイレクト・マップ DMA ウィンドウを物理メモリ 0 から他の場所に移動します。 この章では,まだ OpenVMS バージョン 7.2 またはそれ以降のドライバにアップデートしていない場合にドライバを更新するのに必要な情報とその背景について,詳しく説明します。 この章では,バス・アドレス可能プール (BAP) については説明しません。 図 19-1 「PCI ベース DMA」 に示すように,すべての PCI ベースのマシンで, ダイレクト・マップ DMA ウィンドウは PCI 空間の (通常は) 1 GB から始まり, 1 GB の場合は 0 から始まる物理メモリを使用します。 通常,ドライバはそれぞれのバッファ・アドレスを, IOC$K_DIRECT_DMA_SIZE ファンクション・コードを指定して IOC$NODE_DATA を呼び出すことで返されたウィンドウの長さと比較します。 ここでは,メモリ側のウィンドウが 0 から始まるものと仮定しています。 マップ・レジスタが必要かどうかを判断するためによく使われている別の方法として, MMG$GL_MAXPFN を確認する方法があります。 この方法も OpenVMS バージョン 7.3 では正しく動作しない可能性があります。 もっとわかりやすい図と説明については『Writing OpenVMS Alpha Device Drivers in C』を参照してください。 図 19-2 「OpenVMS DMA」 に示すように Galaxy およびメモリ・ホールについて考慮すると, ダイレクト・マップ DMA ウィンドウの位置を変更しなければならなくなります。 メモリ内でダイレクト・マップ DMA ウィンドウのベースがどこにあるかをドライバから判断することはできません。 単にバッファ・アドレスをウィンドウの長さと比較しても, バッファがダイレクト・マップ DMA ウィンドウの内部にあるかどうか判断するのに十分ではありません。また,MMG$GL_MAXPFN に対して比較しても, すべてのプールがウィンドウの内部にあるかどうか保証できません。 チェックしなければならない正しいセルは MMG$GL_MAX_NODE_PFN です。 さらに,アライメントについて考慮すると,物理バス・アドレスの計算に少し異なるオフセットを組み込まなければならなくなります。 この問題に対処するために, 新しいファンクション・コードが IOC$NODE_DATA に追加されました。 ここではダイレクト・マップ DMA に関連するすべてのコードのリストを示し, データがどのような意味を持つかについても説明します。
IOC$K_DIRECT_DMA_BASE_PA コードを使用して返されるアドレスは, オフセットを計算するのに必要です (これは通常,メモリ PA とバス・アドレスの間の 1 GB の差として使用されます)。 オフセットは,ベース・バス・アドレスとベース・メモリ・アドレスの間の符号付きの差として定義されます。これは必ずしも 1 GB ではありません。 |
![]() |
|||||||||||||||
|