前へ | 次へ | 目次 | 索引 |
共用メモリ・グローバル・セクション は,共用コミュニティ内のすべてのインスタンスからアクセスできるメモリをマッピングします。これらのオブジェクトは Galaxywide 共用セクション とも呼びます。このような各オブジェクトには名前,バージョン,保護属性があります。
17.1 共用メモリの使用
アプリケーション・プログラムは,Galaxywide 共用セクションをマッピングすることで共用メモリにアクセスします。プログラミング・モデルは標準の OpenVMS グローバル・セクションと同じです。つまり,共用メモリを使用する各インスタンスで,その共用メモリを作成,マッピング,アンマッピング,削除します。共用メモリ・グローバル・セクションには次の属性があります。
プログラマの立場から見ると,共用メモリ・グローバル・セクションはメモリ常駐セクションによく似ています。メモリ常駐セクションを作成するときに使用するシステム・サービスと同じサービスを使用して,Galaxywide 共用セクションを作成します。フラグ SEC$M_SHMGS をセットすると,サービスは共用メモリ・グローバル・セクションに対して動作します。
メモリ常駐セクションと異なり,Galaxywide セクションに対して空間を割り当てるために,予約メモリ・レジストリは使用されません。SYSMAN RESERVE コマンドは,ノード固有メモリにのみ影響します。通常の OpenVMS ページング操作のために共用メモリは使用されないので,共用メモリを予約する必要はありません。
Galaxywide セクションに対して共用ページ・テーブルを作成しなければならないかどうかを指定するためのユーザ・インタフェースもありません。その代わり,Galaxywide セクションに対する共用ページ・テーブルの作成は,セクション・サイズによって決定されます。OpenVMS バージョン 7.2 では,共用ページ・テーブルは 128 ページ (1MB) 以上のセクションに対して作成されます。Galaxywide 共用ページ・テーブルはすべてのGalaxy インスタンス間で共用されます。
17.2 システム・サービス
ここでは,共用メモリ・グローバル・セクションをサポートする新しいシステム・サービスと,変更されたシステム・サービスについて説明します。
17.2.1 強化されたサービス
新しい共用メモリ・グローバル・セクション・フラグ SEC$M_SHMGS を認識するように,次のシステム・サービスが強化されました。
次のシステム・サービスは共用メモリを操作できるように強化されていますが,インタフェースは変更されていません。
17.2.2 新しいセクション・フラグ SEC$M_READ_ONLY_SHPT
新しいセクション・フラグ SEC$M_READ_ONLY_SHPT は,SYS$CREATE_GDZRO と SYS$CRMPSC_GDZRO_64 サービスで認識されます。このビットがセットされている場合は,読み込みアクセスだけが可能な共用ページ・テーブルをセクション用に作成することをシステムに要求します。この機能は特に,メモリ常駐セクションや Galaxy 共用セクションが多くのプログラムで読み込まれるものの,書き込むプログラムは 1 つしかない環境で役立ちます。
共用ページ・テーブル・セクションが割り当てられている Galaxy 共用セクションまたはメモリ常駐セクションをマッピングする場合には,データにアクセスするために次のオプションを使用できます。
共用ページ・テーブル | 読み込み専用 | 読み込みと書き込み |
---|---|---|
何も作成されない | マップ要求に SEC$M_WRT フラグをセットしない。
プライベート・ページ・テーブルは,セクションをマッピングする共用ページ・テーブル領域を指定した場合でも,常に使用される。 |
マップ要求に SEC$M_WRT フラグをセットする。
プライベート・ページ・テーブルは,セクションをマッピングする共用ページ・テーブル領域を指定した場合でも,常に使用される。 |
書き込みアクセス | マップ要求に SEC$M_WRT フラグをセットしない。
プライベート・ページ・テーブルが使用されることを確認する。セクションをマッピングする共用ページ・テーブル領域を指定しない。指定すると,エラー状態 S$_IVSECFLG が返される。 |
マップ要求に SEC$M_WRT フラグをセットする。
セクションをマッピングする共用ページ・テーブル領域を指定した場合,マッピングのために共用ページ・テーブル・セクションが使用される。 |
読み込みアクセス | マップ要求に SEC$M_WRT フラグをセットしない。セクションをマッピングする共用ページ・テーブル領域を指定した場合,マッピングのために共用ページ・テーブル・セクションが使用される。 | マップ要求に SEC$M_WRT フラグをセットする。プライベート・ページ・テーブルが使用されることを確認する。セクションをマッピングする共用ページ・テーブル領域を指定しない。指定すると,エラー状態 SS$_IVSECFLG が返される。 |
Galaxy 共用セクションの共用ページ・テーブルも Galaxy 共用セクションとして実装されます。このため,このセクションに接続されているすべての OpenVMS インスタンスで読み込みアクセスが許可されるか,またはすべてのインスタンスで読み込みアクセスと書き込みアクセスが許可されます。セクションを作成するために,最初のインスタンスが要求する SEC$M_READ_ONLY_SHPT フラグの設定がすべてのインスタンスで使用されます。 SYS$CRMPSC_GDZRO_64 サービスを使用すると,常に SEC$M_WRT フラグがセットされ,書き込みのためにセクションをマッピングすることが示されます。このサービスを使用して,読み込み専用アクセスのために共用ページ・テーブルを使用するセクションを作成する場合は,プライベート・ページ・テーブルを使用しなければならず,セクションをマッピングする共用テーブル領域を指定することはできません。 |
17.3 Galaxywide グローバル・セクション
Galaxy 共用メモリにオブジェクトを作成するには,SHMEM 特権が必要です。既存のセクションにマッピングする権利は,通常のアクセス制御機能によって制御されます。既存のセクションをマッピングするために SHMEM は必要ありません。通常のメモリ常駐セクションを作成する場合は,VMS$MEM_RESIDENT_USER 識別子が必要ですが,Galaxywide セクションの場合は必要ありません。
Galaxywide メモリ・セクションの作成とマッピングは,メモリ常駐セクションを作成する場合と同じサービスで実行されます。現在,次のサービスが SEC$M_SHMGS フラグを認識します。
SYS$CREATE_GDZRO
SYS$CRMPSC_GDZRO_64
SYS$MGBLSC_64
SYS$DGBLSC
SYS$CREATE_GDZRO と SYS$CRMPSC_GDZRO_64 は新しい状態コードを返します。
状態コード | 説明 |
---|---|
SS$_INV_SHMEM | 共用メモリが不正である。 |
SS$_INSFRPGS | 空き共用ページまたはプライベート・ページが不足している。 |
SS$_NOBREAK | Galaxy ロックが別のノードによって保有されており,破棄されていない。 |
SS$_LOCK_TIMEOUT | Galaxy ロック・タイムアウトが発生した。 |
$ INSTALL LIST/GLOBAL と $ SHOW MEMORY コマンドは Glaxywide セクションを認識します。
Galaxywide セクションはそれぞれ独自のネーム・スペースを使用します。さまざまな所有者 UIC に対して,システム・グローバル・セクションとグループ・グローバル・セクションを識別するために常に同じ名前を使用できるのと同様に,Galaxywide システム・グローバル・セクションと Galaxywide グループ・グローバル・セクションで同じ名前を使用できます。
Galaxywide セクションにはそれぞれ,セキュリティ・クラスが割り当てられます。
GLXSYS_GLOBAL_SECTION
GLXGRP_GLOBAL_SECTION
これらのセキュリティ・クラスは $GET_SECURITY と $SET_SECURITY システム・サービス,DCL コマンド SET/SHOW SECURITY で使用されます。
これらの新しいセキュリティ・クラスは Galaxy 環境でのみ有効です。Galaxy 以外のノードでは認識されません。
Galaxywide グローバル・セクションが共用インスタンスに存在する場合は,そのセキュリティ属性を検索し,影響を与えることだけが可能です。
次の例は,Galaxywide セクションの監査メッセージを示しています。
%%%%%%%%% OPCOM 20-MAR-2002 10:44:43.71 %%%%%%%% (from node GLX1 at 20-MAR-2002 10:44:43.85) Message from user AUDIT$SERVER on GLX1 Security alarm (SECURITY) on GLX1, system id: 19955 Auditable event: Object creation Event information: global section map request Event time: 20-MAR-2002 10:44:43.84 PID: 2040011A Process name: ANDY Username: ANDY Process owner: [ANDY] Terminal name: RTA1: Image name: MILKY$DKA100:[ANDY]SHM_MAP.EXE;1 Object class name: GLXGRP_GLOBAL_SECTION Object name: [47]WAY____D99DDB03_0$MY_SECTION Secondary object name: <Galaxywide global section> Access requested: READ,WRITE Deaccess key: 8450C610 Status: %SYSTEM-S-CREATED, file or section did not exist; has been created |
"Object name" フィールドに注意してください。ここに表示されているオブジェクト名は,OpenVMS Galaxy 内のセクションを一意に識別します。フィールドは次のとおりです。
[47] | ( グループ・グローバル・セクションの場合のみ ) セクションの作成者の UIC グループを識別する。 |
WAY____D99DDB03_0$ | 共用コミュニティの識別子。 |
MY_SECTION | ユーザが指定したセクションの名前。 |
ユーザはセキュリティ・プロファイルを設定または表示するために,要求に対してセクション名とクラスだけを指定できます。UIC は常に現在のプロセスから取得され,コミュニティ識別子はプロセスが実行されているコミュニティから取得されます。
Galaxywide システム・グローバル・セクションの出力は,"Object class name" と "Objects name" フィールドでのみ異なります。このタイプのセクションのオブジェクト名には,グループ識別フィールドが含まれません。
オブジェクト・クラス名: | GLXSYS_GLOBAL_SECTION |
オブジェクト名: | WAY____D99DDB03_0$SYSTEM_SECTION |
Galaxywide メモリ・セクションのセキュリティ属性は,それがどのインスタンスで実行されているかとは関係なく,プロセスにとって同一でなければなりません。 この条件は,この共用コミュニティに参加するすべてのインスタンスを,すべてのノードがセキュリティ関連ファイルを共用する「同種」OpenVMS Cluster に参加させることで実現できます。 SYSUAF.DAT, SYSUAFALT.DAT (システム登録ファイル) 特に,保護の変更を Galaxywide セクションに自動的に伝達するには,すべての共用インスタンスで同じ物理ファイル (VMS$OBJECTS.DAT) を使用することが必要です。 インストールしたシステムで,これらのファイルが Galaxy 全体で共用されない場合は,Galaxywide 共用セクションの作成者は,セクションが各インスタンスで同じセキュリティ属性を持つようにしなければなりません。このためには,手動の操作が必要です。 |
この章では,OpenVMS Alpha バージョン 7.3 で PCI ドライバに対してのダイレクト・マップ DMA ウィンドウについて説明します。
18.1 ダイレクト・マップ DMA ウィンドウの変更
この節で説明する変更は OpenVMS Galaxy とメモリ・ホールをサポートするために OpneVMS バージョン 7.2 で変更されたものです。この変更では,ダイレクト・マップ DMA ウィンドウを物理メモリ 0 から他の場所に移動します。この章では,まだ OpenVMS バージョン 7.2 またはそれ以降のドライバにアップデートしていない場合にドライバを更新するのに必要な情報とその背景について,詳しく説明します。
この章では,バス・アドレス可能プール (BAP) については説明しません。
18.2 OpenVMS バージョン 7.2 より以前に PCI ダイレクト・マップ DMA がどのように機能していたか
図 18-1 に示すように,すべての PCI ベースのマシンで,ダイレクト・マップ DMA ウィンドウは PCI 空間の ( 通常は ) 1 GB から始まり,1 GB の場合は 0 から始まる物理メモリを使用します。
図 18-1 PCI ベース DMA
通常,ドライバはそれぞれのバッファ・アドレスを,IOC$K_DIRECT_DMA_SIZE ファンクション・コードを指定して IOC$NODE_DATA を呼び出すことで返されたウィンドウの長さと比較します。ここでは,メモリ側のウィンドウが 0 から始まるものと仮定しています。マップ・レジスタが必要かどうかを判断するためによく使われている別の方法として,MMG$GL_MAXPFN を確認する方法があります。この方法も OpenVMS バージョン 7.3 では正しく動作しない可能性があります。
もっとわかりやすい図と説明については『Writing OpenVMS Device Alpha Drivers in C』を参照してください。
18.3 現在のバージョンの OpenVMS で PCI ダイレクト・マップ DMA がどのように機能するか
図 18-2 に示すように Galaxy およびメモリ・ホールについて考慮すると,ダイレクト・マップ DMA ウィンドウの位置を変更しなければならなくなります。
図 18-2 OpenVMS DMA
メモリ内でダイレクト・マップ DMA ウィンドウのベースがどこにあるかをドライバから判断することはできません。単にバッファ・アドレスをウィンドウの長さと比較しても,バッファがダイレクト・マップ DMA ウィンドウの内部にあるかどうか判断するのに十分ではありません。また,MMG$GL_MAXPFN に対して比較しても,すべてのプールがウィンドウの内部にあるかどうか保証できません。チェックしなければならない正しいセルは MMG$GL_MAX_NODE_PFN です。さらに,アライメントについて考慮すると,物理バス・アドレスの計算に少し異なるオフセットを組み込まなければならなくなります。
18.4 0 以外のダイレクト・マップ DMA ウィンドウをサポートするためのIOC$NODE_DATA の変更
この問題に対処するために,新しいファンクション・コードが IOC$NODE_DATA に追加されました。ここではダイレクト・マップ DMA に関連するすべてのコードのリストを示し,データがどのような意味を持つかについても説明します。
コード | 説明 |
---|---|
IOC$K_DIRECT_DMA_BASE | これは PCI 側のベース・アドレスであるか,またはバス・アドレスである。これは,IOC$K_DDMA_BASE_BA というファンクション・コードの同意語である。32 ビットの結果が返される。 |
IOC$DIRECT_DMA_SIZE | Galaxy 以外のマシンでは,これはダイレクト・マップ DMA ウィンドウのサイズ ( メガバイト数 ) を返す。ダイレクト・マップ DMA ウィンドウが 0 から始まらないシステムでは,返されるデータは 0 であり,ダイレクト・マップ DMA ウィンドウが存在しないことを示す。32 ビットの結果が返される。 |
IOC$K_DDMA_WIN_SIZE | すべてのシステムで,これはダイレクト・マップ DMA ウィンドウのサイズを返す ( メガバイト単位 )。32 ビットの結果が返される。 |
IOC$K_DIRECT_DMA_BASE_PA | これはダイレクト・マップ DMA ウィンドウのメモリ内でのベース物理アドレスである。32 ビットの結果が返される。 |
IOC$K_DIRECT_DMA_BASE_PA コードを使用して返されるアドレスは,オフセットを計算するのに必要です ( これは通常,メモリ PA とバス・アドレスの間の 1 GB の差として使用されます )。オフセットは,ベース・バス・アドレスとベース・メモリ・アドレスの間の符号付きの差として定義されます。これは必ずしも 1 GB ではありません。
前へ | 次へ | 目次 | 索引 |