OpenVMS Alpha
オペレーティング・システム
64 ビット・アドレッシングおよび
VLM 機能説明書


前へ 次へ 目次 索引


2.2.3 ページ・テーブル空間

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

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

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

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.3FFFFFFF16 で終了するプロセス永久仮想リージョンが 1 つ存在します。これがプログラム・リージョンです。P1 空間に対しても,仮想アドレス 0.4000000016 で始まり,仮想アドレス 0.7FFFFFFF16 で終了するプロセス永久リージョンが 1 つ存在します。これが制御リージョンです。

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

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

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

P2 空間は,P2 空間の最下位仮想アドレス 0.8000000016 から始まる,稠密拡張可能な仮想リージョンを持ちます。このリージョンを 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 システム・サービスで仮想リージョンを明示的に削除しないと,イメージが終了したときに,ユーザ定義仮想リージョンと共に,作成されたすべてのアドレス空間が削除されます。


第 3 章
システム・サービスの 64 ビット・アドレッシングのサポート

新規に,OpenVMS システム・サービスが追加されました。また,64 ビット・アドレス空間を管理することを目的として,多くの既存のサービスに変更が加えられました。本章では,64 ビット・アドレッシング,および VLM をサポートするシステム・サービスについて説明します。具体的には,64 ビット・アドレスをサポートするために既存の 32 ビット・サービスに加えられた変更について説明し,新しく追加された 64 ビット・システム・サービスの一覧を示します。

アプリケーション・プログラム内で 64 ビット・アドレッシングをサポートするシステム・サービスの例については,付録 C を参照してください。本章に示されている OpenVMS システム・サービスについての詳細は,『OpenVMS System Services Reference Manual: A--GETMSG』および『OpenVMS System Services Reference Manual: GETQUI--Z』を参照してください。

3.1 システム・サービスに関する用語

本書では,次に示すシステム・サービス定義を使用します。

32 ビット・システム・サービス

32 ビット・システム・サービスは,すべてのアドレス引数を 32 ビット・アドレスとして受け取ることが定義されているシステム・サービスです。値渡しの場合,32 ビット仮想アドレスは実際には 32 ビット符号拡張アドレスの可能性があり,この場合は 64 ビットがサービスに渡されます。

64 ビット・フレンドリ・インタフェース

64 ビット・フレンドリ・インタフェースは,すべての 64 ビット・アドレスで呼び出すことができるインタフェースです。インタフェースにまったく変更がなく,64 ビット・アドレスを処理するのに変更も必要としない場合,その 32 ビット・システム・サービス・インタフェースは,64 ビット・システム・サービス・フレンドリです。システム・サービスを実現する内部コードは,変更を必要とする場合があります。ただし,システム・サービス・インタフェースは変更の必要はありません。

バージョン 7.0 より前のバージョンの OpenVMS Alpha の OpenVMS Alpha システム・サービスの大部分は,次の理由から 64 ビット・フレンドリ・インタフェースを持っています。

64 ビット・フレンドリ・システム・サービスの例には $QIO,$SYNCH,$ENQ,$FAO などがあります。

$CRETVA,$DELTVA,および $CRMPSC など,メモリ管理システム・サービスの大部分は,64 ビット・フレンドリでないインタフェースを伴うルーチンです。INADR 引数および RETADR 引数配列を変更して 64 ビット・アドレスを保持することは簡単ではありません。

64 ビット・システム・サービス

64 ビット・システム・サービスは,すべての引数を 64 ビット・アドレスとして受け付けるよう定義されているシステム・サービスです。また 64 ビット・システム・サービスは,すべての仮想アドレスの 64 ビット全体を使用して,64 ビットの仮想アドレスを渡します。

64 ビット・システム・サービスのうち,64 ビット・アドレスを参照渡しで受け取るサービスには,_64 という接尾辞がつきます。32 ビットと 64 ビットの両方で使用できるシステム・サービスでは,これによって 64 ビット機能のバージョンと,対応する 32 ビット機能のバージョンが区別されます。一方,新規サービスの場合は,この接尾辞によって,64 ビット長アドレス・セルが読み込み/書き込みされることが明確に示されます。埋め込み 64 ビット・アドレスを含む構造が渡されるとき,この構造が 64 ビット構造として自己識別しない場合にも,この接尾辞が使用されます。ルーチンが受け取るのは 64 ビット・ディスクリプタのため,ルーチン名に "_64" を含める必要はありません。なお,任意の値を参照渡しで渡すときには,接尾辞が必要ないことに注意してください。接尾辞が必要なのは,64 ビット・アドレスを参照渡しで渡すときです。

3.2 64 ビット・アドレスをサポートするシステム・サービス

64 ビット・アドレスをサポートする OpenVMS Alpha システム・サービスを 表 3-1 に示します。

RMS システム・サービスもいくつかの 64 ビット・アドレッシング機能を提供しますが,完全な 64 ビット・システム・サービスではないため,次の表には示されていません。詳細は,第 5 章 を参照してください。

表 3-1 64 ビット・システム・サービス
サービス 引数
アライメント・システム・サービス
$GET_ALIGN_FAULT_DATA buffer_64, buffer_size, return_size_64
$GET_SYS_ALIGN_FAULT_DATA buffer_64, buffer_size, return_size_64
$INIT_SYS_ALIGN_FAULT_REPORT match_table_64, buffer_size, flags
AST システム・サービス
$DCLAST astadr_64, astprm_64, acmode
条件ハンドラ・システム・サービス
$FAO ctrstr_64, outlen_64, outbuf_64, p1_64...pn_64
$FAOL ctrstr_64, outlen_64, outbuf_64, long_prmlst_64
$FAOL_64 ctrstr_64, outlen_64, outbuf_64, quad_prmlst_64
$GETMSG msgid, msglen_64, bufadr_64, flags, outadr_64
$PUTMSG msgvec_64, actrtn_64, facnam_64, actprm_64
$SIGNAL_ARRAY_64 mcharg, sigarg_64
CPU スケジューリング・システム・サービス
$CPU_CAPABILITIES cpu_id, select_mask, modify_mask, prev_mask, flags
$FREE_USER_CAPABILITY cap_num, prev_mask, flags
$GET_USER_CAPABILITY cap_num, select_num, select_mask, prev_mask, flags
$PROCESS_AFFINITY pidadr, prcnam, select_mask, modify_mask, prev_mask, flags
$PROCESS_CAPABILITIES pidadr, prcnam, select_mask, modify_mask, prev_mask, flags
$SET_IMPLICIT_AFFINITY pidadr, prcnam, state, cpu_id, prev_mask
イベント・フラグ・システム・サービス
$READEF efn, state_64
高速 I/O システム・サービス
$IO_CLEANUP fandle
$IO_PERFORM fandle, chan, iosadr, bufadr, buflen, porint
$IO_PERFORMW fandle, chan, iosadr, bufadr, buflen, porint
$IO_SETUP func, bufobj, iosobj, astadr, flags, return_fandle
I/O システム・サービス
$QIO(W)1 efn, chan, func, iosb_64, astadr_64, astprm_64, p1_64, p2_64, p3_64, p4_64, p5_64, p6_64
$SYNCH efn, iosb_64
ロッキング・システム・サービス
$DEQ lkid, vablk_64, acmode, flags
$ENQ(W) efn, lkmode, lksb_64, flags, resnam_64, parid, astadr_64, astprm_64, blkast_64, acmode
論理名システム・サービス
$CRELNM attr, tabnam, lognam, acmode, itmlst
$CRELNT ttr, resnam, reslen, quota, promsk, tabnam, partab, acmode
$DELLNM tabnam, lognam, acmode
$TRNLNM attr, tabnam, lognam, acmode, itmlst
メモリ管理システム・サービス
$ADJWSL pagcnt, wsetlm_64
$CREATE_BUFOBJ_64 start_va_64, length_64, acmode, flags, return_va_64, return_length_64, return_buffer_handle_64
$CREATE_GDZRO gsdnam_64, ident_64, prot, length_64, acmode, flags, ...
$CRMPSC_GDZRO_64 gsdnam_64, ident_64, prot, length_64, region_id_6 4, section_offset_64, acmode, flags, return_va_64, return_length_64, ...
$CREATE_GFILE gsdnam_64, ident_64, file_offset_64, length_64, chan, acmode, flags, return_length_64, ...
$CREATE_GPFILE gsdnam_64, ident_64, prot, length_64, acmode, flags
$CREATE_GPFN gsdnam_64, ident_64, prot, start_pfn, page_count, acmode, flags
$CREATE_REGION_64 length_64, region_prot, flags, return_region_id_64, return_va_64, return_length_64, ...
$CRETVA_64 region_id_64, start_va_64, length_64, acmode, flags, return_va_64, return_length_64
$CRMPSC_FILE_64 region_id_64, file_offset_64, length_64, chan, acmode, flags, return_va_64, return_length_64, ...
$CRMPSC_GFILE_64 gsdnam_64, ident_64, file_offset_64, length_64, chan, region_id_64, section_offset, acmode, flags, return_va_64, return_length_64, ...
$CRMPSC_GPFILE_64 gsdnam_64, ident_64, prot, length_64, region_id_64, section_offset_64, acmode, flags, return_va_64, return_length_64, ...
$CRMPSC_GPFN_64 gsdnam_64, ident_64, prot, start_pfn, page_count, region_id_64, relative_page, acmode, flags, return_va_64, return_length_64, ...
$CRMPSC_PFN_64 region_id_64, start_pfn, page_count, acmode, flags, return_va_64, return_length_64, ...
$DELETE_BUFOBJ buffer_handle_64
$DELETE_REGION_64 region_id_64, acmode, return_va_64, return_length_64
$DELTVA_64 region_id_64, start_va_64, length_64, acmode, return_va_64, return_length_64
$DGBLSC flags, gsdnam_64, ident_64
$EXPREG_64 region_id_64, length_64, acmode, flags, return_va_64, return_length_64
$GET_REGION_INFO function_code, region_id_64, start_va_64, ,buffer_length, buffer_address_64, return_length_64
$LCKPAG_64 start_va_64, length_64, acmode, return_va_64, return_length_64
$LKWSET_64 start_va_64, length_64, acmode, return_va_64, return_length_64
$MGBLSC_64 gsdnam_64, ident_64, region_id_64, section_offset_64, length_64, acmode, flags, return_va_64, return_length_64, ...
$MGBLSC_GPFN_64 gsdnam_64, ident_64, region_id_64, relative_page, page_count, acmode, flags, return_va_64, return_length_64, ...
$PURGE_WS start_va_64, length_64
$SETPRT_64 start_va_64, length_64, acmode, prot, return_va_64, return_length_64, return_prot_64
$ULKPAG_64 start_va_64, length_64, acmode, return_va_64, return_length_64
$ULWSET_64 start_va_64, length_64, acmode, return_va_64, return_length_64
$UPDSEC_64(W) start_va_64, length_64, acmode, updflg, efn, iosa_64, return_va_64, return_length_64, ...
プロセス制御システム・サービス
$GETJPI(W) efn, pidadr, prcnam, itmlst, iosb, astadr, astprm
$PROCESS_SCAN pidctx, itmlst
時刻システム・サービス
$ASCTIM timlen, timbuf, timadr, cvtflg
$ASCUTC timlen, timbuf, utcadr, cvtflg
$BINTIM timbuf, timadr
$BINUTC timbuf, utcadr
$CANTIM reqidt_64, acmode
$GETTIM timadr_64
$GETUTC utcadr
$NUMTIM timbuf, timadr
$NUMUTC timbuf, utcadr
$SETIME timadr
$SETIMR efn, daytim_64, astadr_64, reqidt_64, flags
$TIMCON timadr, utcadr, cvtflg
他のシステム・サービス
$CMEXEC_64 routine_64, quad_arglst_64
$CMKRNL_64 routine_64, quad_arglst_64
$GETSYI(W) efn, csidadr, nodename, itmlst, iosb, astadr, astprm
$IDTOASC id, namlen, nambuf, resid, attrib, contxt


164 ビット・アドレッシングをサポートする $QIO(W) 引数についての詳細は 第 7 章 参照。


前へ 次へ 目次 索引