[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

2 仮想アドレス空間の概要

本章では, OpenVMS Alpha 64ビット仮想メモリ・アドレス空間のレイアウトと構成要素について説明します。

64ビット・アドレッシングをサポートする OpenVMS Alphaプログラミング・ツールや言語についての詳細,および 64ビット・アドレッシングや VLMをサポートするようアプリケーションを拡張する場合の注意点については, 本書のこれ以降の章を参照してください。


2.1  従来のOpenVMS 32ビット仮想アドレス空間レイアウト

以前のバージョンのOpenVMS Alphaオペレーティング・システムの場合, 仮想アドレス空間のレイアウトは基本的に,VAXアーキテクチャによって定義される 32ビット仮想アドレス空間に基づいていました。OpenVMS VAXレイアウトに基づく OpenVMS Alphaレイアウトを図 2-1に示します。

図 2-1 32ビット仮想アドレス空間レイアウト :(クリックで表示)

OpenVMS VAX仮想アドレス空間の下半分 (アドレス0〜7FFFFFFF(16))は, プロセス・プライベート空間と呼ばれています。 プロセス・プライベート空間 この空間はさらに,P0空間およびP1空間という 2つの等しい空間に分けられます。各空間とも1 GB長です。 P0空間の範囲は0から 3FFFFFFF(16)です。 P0空間は0の位置で始まり, アドレスが増加する方向に向かって拡張します。一方,P1空間の範囲は 40000000(16)から7FFFFFFF(16)です。P1は7FFFFFFF(16)の位置で始まり, アドレスが減少する方向に向かって拡張します。

VAX仮想アドレス空間の上半分は,システム空間と呼ばれています。 システム空間の下半分(アドレス80000000(16)〜BFFFFFFF(16))は, S0空間と呼ばれています。S0空間は80000000(16)で始まり, アドレスが増加する方向に向かって拡張します。

VAXアーキテクチャでは, ページ・テーブルと仮想アドレス空間の各領域を関連付けています。プロセッサは, システム・ページ・テーブルを使用して,システム空間アドレスを変換します。また, 各プロセスは,プロセス自身のP0ページ・テーブルおよび P1ページ・テーブルを持ちます。なお,VAXページ・テーブルは, 可能な仮想アドレス空間をすべてマップするわけではありません。 作成されたそのリージョンの一部だけをマップします。


2.2  OpenVMS Alpha 64ビット仮想アドレス空間レイアウト

OpenVMS Alpha 64ビット・アドレス空間レイアウトは,従来のOpenVMS 32ビット・アドレス空間レイアウトを拡張したものです。

64ビット仮想アドレス空間レイアウトの設計を 図 2-2に示します。

図 2-2 64ビット仮想アドレス空間レイアウト :(クリックで表示)

64ビット仮想アドレス空間レイアウトは,OpenVMS Alphaオペレーティング・システムおよびそのユーザの,現在の要望, および将来の要望を満たすように設計されています。新しいアドレス空間は, 次の基本領域で構成されています。


2.2.1 プロセス・プライベート空間

プロセス・プライベート・アドレス空間は, OpenVMSオペレーティング・システムのメモリ管理設計の中心です。

プロセス・プライベート空間,つまりプロセス空間は, PT空間以下のすべての仮想アドレスを含みます。 図 2-2に示すように, プロセス空間のレイアウトは,さらにP0,P1,およびP2空間に分かれています。 P0空間はプログラム領域,P1空間は制御領域,P2空間は64ビット・プログラム領域です。

P0およびP1空間は, VAXアーキテクチャで定義している P0およびP1領域と同等に定義されています。両者で,0.00000000(16)から 0.7FFFFFFF(16)の範囲に相当する従来の 32ビット・プロセス・プライベート領域を含みます。 P2空間は, P1空間のすぐ上の0.80000000(16)で始まり, PT空間の最下位アドレスのすぐ下で終了する残りのプロセス空間をすべて含みます。

単一64ビット整数として解釈される場合, P2空間アドレスは正の値でも負の値でも構いません。


2.2.2 システム空間

64ビット・システム空間は, PT空間を含む範囲よりも高位の 64ビット仮想アドレス範囲全体の部分に相当します。 図 2-2に示すように,システム空間はさらにS0, S1,およびS2空間に分かれています。

S0およびS1空間は, VAXアーキテクチャで定義しているS0および S1領域と同等に定義されています。両者で,FFFFFFFF.80000000(16)から FFFFFFFF.FFFFFFFF(16) の範囲に相当する従来の 32ビット・プロセス・プライベート領域を含みます。 S2空間は, PT空間の最高位アドレスと,結合されたS0/S1空間の最下位アドレスとの間に存在する, 残りのシステム空間をすべて含みます。

S0,S1,およびS2空間は,すべてのプロセスによって完全に共用されます。 S0,およびS1は,上位方向の仮想アドレスに向かって拡張します。 S2空間は, 一般に下位方向の仮想アドレスに向かって拡張します。

システム空間内のアドレスを作成および削除できるのは, カーネル・モードで実行されるコードだけです。 ただしシステム空間ページのページ保護を設定することによって, 特権の少ないアクセス・モードでも読み込みおよび書き込みアクセスを認めることができます。

システム空間ベースは, S2_SIZEシステム・パラメータにより制御されます。 S2_SIZEは,S2空間を予約するためのメガバイト数です。 省略時の設定の値は,64ビット(S2)システム空間を使用することが予想される要素が, それぞれ必要とするサイズに基づきます。ブート時に OpenVMSによって設定される利用者は,ページ・フレーム数 (PFN)データベースおよびグローバル・ページ・テーブルです( SYSGENによるシステム・パラメータの設定についての詳細は, 『OpenVMSシステム管理ユーティリティ・リファレンス・マニュアル(下巻)』 を参照してください)。

グローバル・ページ・テーブル(GPT),およびPFNデータベースは, S2空間の最下位アドレス部分に存在します。GPTおよびPFNデータベースを S2空間に移動することによって,これらの領域のサイズが,小さな S0/S1空間の制限をもはや受けることはありません。これによりOpenVMSは, より大容量の物理メモリ, およびより大きなグローバル・セクションをサポートできるようになりました。


2.2.3 ページ・テーブル空間

OpenVMS Alpha V7.0 以前のバージョンでは,ページ・テーブル空間(または, PT空間ともいう)を, 複数の方法でアドレス指定することができました。 PALcode TBミス・ハンドラは, 2.00000000(16)で始まるアドレスを使用してPTEを読み込んでいました。一方, メモリ管理コードは,まず従来の 32ビット・システム空間内にページ・テーブルのアドレスを指定します。 プロセス・ページ・テーブルはプロセス・ヘッダ(PHD)内にあり, システム空間ページ・テーブルは最高位の仮想アドレスに位置していました。 これらはすべて,従来の32ビット・システム空間内にありました。

OpenVMS Alpha Version 7.0の場合,ページ・テーブルのアドレスは基本的に 64ビットのPT空間内で指定されます。 ページ・テーブル参照はこの仮想アドレス範囲に対して行われます。これらは, 32ビット共用システム・アドレス空間にはもはやありません。

図 2-2内の点線は, プロセス・プライベート空間と共用空間の境界を表します。この境界はPT空間にあり, プロセス・プライベート・ページ・テーブル・エントリと共用ページ・テーブル・エントリ間の境界として機能します。 これらのエントリ・セットを合わせたものが, 指定されたプロセスで使用できるアドレス空間全体をマップします。PT空間は, プロセスごとに同じ仮想アドレスにマップされ,これは, FFFFFFFC.00000000(16)など,通常はきわめて高位なアドレスです。


2.2.4 仮想アドレス空間のサイズ

Alphaアーキテクチャは64ビット・アドレスをサポートします。OpenVMS Alpha Version 7.0は,現在の Alphaアーキテクチャ実装でサポートされる仮想アドレス空間の合計サイズを, 4 GB (ギガバイト)から8 TB (テラバイト)へと,大きく増加させています。

Alphaアーキテクチャでは,仮想アドレスを物理メモリ・アドレスに変換するとき, どの実装であっても,仮想アドレスの64ビットすべてを使用, またはチェックすることを要求しています。しかし,Alphaアーキテクチャの実装は, 仮想アドレス空間のサブセットを実現することができます。現在の Alphaハードウェア実装は64ビット仮想アドレスの中で43有効ビットをサポートします。 この結果,8 TBのアドレス空間が実現します。

現在のAlphaアーキテクチャ実装では,仮想アドレス内のビット42は,ビット63 まで符号拡張されているか,またはその内容が引き継がれていなければなりません (最下位有効ビットは0から始まります)。ビット42からビット63までがすべて0でない, またはすべて1でない仮想アドレスが参照されると,アクセス違反を引き起こします。 従って,有効な8 TBのアドレス空間は,中央が"非アクセス"範囲で区切られた, 別々の2つの4 TB範囲に分割されています。

OpenVMS Alphaアドレス空間のレイアウトでは,この非アクセス範囲を P2空間に透過的に配置しています(OpenVMS Alphaメモリ管理システム・サービスは, 実質的に連続したアドレス範囲を常に返します)。 OpenVMS Alphaアドレス空間レイアウトの設計の結果,P2空間内の有効アドレスは,符号付き 64ビット整数として解釈されるとき,正の値にも負の値にもなることができます。

32ビット非特権コードの互換性を確保するには,有効な 32ビット仮想アドレス内のビット31を引き続き使用して,P0/P1空間内のアドレスと, S0/S1空間内のアドレスを区別します。


2.3 仮想リージョン

仮想リージョンは,プロセス・プライベート仮想アドレスの予約範囲です。 これは,実行時にユーザ・プログラムによって予約される "ユーザ定義" 仮想リージョン,またはプロセス作成の中でプロセスに代わりシステムによって予約される "プロセス永久" 仮想リージョンのいずれかに分けられます。

プロセスが作成されるとき, OpenVMSによって3つのプロセス永久仮想リージョンが定義されます。

この3つのプロセス永久仮想リージョンが存在するため, プログラマが作成するアプリケーションがアドレス空間を余分に確保する必要がない場合, 仮想リージョンを作成する必要はありません。

仮想リージョンでは,アプリケーションの異なるコンポーネントが, 異なる仮想リージョン内のデータを操作することができるため, アプリケーション内でのモジュール性が促進されます。 仮想リージョンが作成されるとき,サービスの呼び出し者には, その仮想リージョンを識別するリージョンIDが返されます。リージョンIDは, そのリージョンの中で仮想アドレスを作成,操作,および削除するときに使用されます。 アプリケーション内の異なるコンポーネントは別々の仮想リージョンを作成できるため, 各自の仮想メモリの使用が競合することはありません。

仮想リージョンには次の特徴があります。


2.3.1 P0空間およびP1空間内のリージョン

すべてのP0空間に対して,仮想アドレス0で始まり,仮想アドレス 0.3FFFFFFF(16)で終了するプロセス永久仮想リージョンが1つ存在します。 これがプログラム・リージョンです。 P1空間に対しても,仮想アドレス 0.40000000(16)で始まり,仮想アドレス0.7FFFFFFF(16) で終了するプロセス永久リージョンが1つ存在します。 これが制御リージョンです。

プログラム・リージョンおよび制御リージョンは,カーネル・モードで所有され, ユーザの作成モードを持つものと考えられます。これは, ユーザ・モードの呼び出し者が, これらのリージョン内で仮想アドレス空間を作成することができるためです。 これによりV7.0より前のリリースのOpenVMSとの上位互換性が保持されます。

このようなプログラム・リージョンおよび制御リージョンを削除することはできません。 これらは,プロセス永久であると考えられます。


2.3.2 64ビット・プログラム・リージョン

P2空間は,P2空間の最下位仮想アドレス0.80000000(16)から始まる, 稠密拡張可能な仮想リージョンを持ちます。このリージョンを 64ビット・プログラム・リージョンと呼びます。P2空間内に 64ビット・プログラム・リージョンを持つことによって, 明示的な仮想リージョンを使用する必要がないアプリケーションは, P2空間に仮想リージョンを作成するオーバヘッドを回避することができます。 この仮想リージョンは常に存在するため,アドレスを P2空間の中で直接作成することができます。

第2.3.3項で説明するように,ユーザは, 占有されていないP2空間に仮想リージョンを作成することができます。 ユーザ定義仮想リージョンが, 64ビット・プログラム・リージョンの最下位アドレスで開始するように定義されている場合, リージョン内で仮想メモリを割り当てようとすると失敗します。

リージョンは,これに付随してユーザ作成モードを持ちます。つまり, どのようなアクセス・モードでも, このリージョン内に仮想アドレス空間を作成することができます。

64ビット・プログラム・リージョンを削除することはできません。 これはプロセス永久とみなされ,イメージがランダウンしても残ります。なお, イメージのラウンダウンによって, 64ビット・プログラム・リージョン内に作成されたすべてのアドレス空間は削除され, リージョンがリセットされてP2空間をすべて含むことに注意してください。


2.3.3 ユーザ定義仮想リージョン

ユーザ定義仮想リージョンは,新しいOpenVMS SYS$CREATE_REGION_64 システム・サービスを呼び出すことによって作成される仮想リージョンです。 ユーザ定義仮想リージョンが作成される位置は,一般的には予測できません。 64ビット・プログラム・リージョンのための拡張領域を最大化するために, OpenVMSメモリ管理は,既存のユーザ定義リージョンより下位の, P2空間内の最高位仮想アドレスを先頭に,仮想リージョンを割り当てます。

プロセス・プライベート・アドレス空間を最大限に制御するために, アプリケーション・プログラマは,仮想リージョンを作成するときに, 先頭の仮想アドレスを指定することができます。これは, ユーザが正確な仮想メモリ・レイアウトを指定することが求められるような状況で効果的です。

仮想リージョンは,仮想アドレスが増加する方向に向かって, または減少する方向に向かって割り当てが行われるように作成することができます。 これによって,スタック形式の構造を伴うアプリケーションは, 仮想アドレス空間を作成し,自然に拡張することができます。

仮想リージョンを作成することによって, OpenVMSサブシステムおよびアプリケーション・プログラマは, 拡張用の仮想アドレス空間を確保することができます。たとえば, アプリケーションは,大きな仮想リージョンを作成し, その仮想リージョンの中でいくつかの仮想アドレスを作成することができます。 この後,アプリケーションがさらに仮想アドレス空間を必要とする場合, 仮想リージョン内での拡張が可能です。 その仮想リージョン内ですでに割り当てられているアドレスに実質的に連続した状態で, さらにアドレス空間を作成することができます。

SYS$CREATE_REGION_64サービスへのフラグ引数に VA$M_P0_SPACEまたは VA$M_P1_SPACEを指定すると, P0空間および P1空間に仮想リージョンを作成することができます。

SYS$DELETE_REGION_64システム・サービスで仮想リージョンを明示的に削除しないと, イメージが終了したときに,ユーザ定義仮想リージョンと共に, 作成されたすべてのアドレス空間が削除されます。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]