日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:仮想アドレス空間の概要
第 3 章:システム・サービスの 64 ビット・アドレッシングのサポート
第 4 章:メモリ管理 VLM 機能
第 5 章:64 ビット・アドレッシングを対象とする RMS インタフェースの強化
第 6 章:ファイル・システムの 64 ビット・アドレッシングのサポート
第 7 章:OpenVMS Alpha デバイスの 64 ビット・アドレッシングのサポート
第 8 章:OpenVMS Alpha 64 ビット API ガイドライン
第 9 章:64 ビット・アドレッシングをサポートする OpenVMS Alpha ツールおよびユーティリティ
第 10 章:言語およびポインタの 64 ビット・アドレッシング・サポート
第 11 章:DEC C RTL の 64 ビット・アドレッシング・サポート
付録 A :64 ビット・アドレッシングのための C マクロ
付録 B :64 ビット・アドレッシングのための MACRO-32 マクロ
付録 C :64 ビット・プログラム例
付録 D :VLM プログラム例
索引
PDF
OpenVMS ホーム
Open VMS Alpha オペレーティング・システム | HPE 日本

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


目次 索引

第 11 章
DEC C RTL の 64 ビット・アドレッシング・サポート

本章は OpenVMS Alpha バージョン 7.0 以降の DEC C ランタイム・ライブラリで提供される 64 ビット・アドレッシング・サポートについて説明します。

DEC C ランタイム・ライブラリは,64 ビット・ポインタをサポートする際に以下の特徴があります。

  • 既存のプログラムのバイナリおよびソースの互換性を保証する。

  • 64 ビット・サポートを利用するよう修正されていないアプリケーションには影響がない。

  • 64 ビット・メモリを割り当てるメモリ割り当てルーチンが強化された。

  • 64 ビット・ポインタに対応するために関数パラメータが拡張された。

  • 呼び出し側が使用しているポインタ・サイズを知る必要がある関数について, 2 種類の実装を用意する。

  • シームレスに正しいインプリメンテーションを呼び出すための新しい情報が, DEC C バージョン 5.2 以降のコンパイラに用意されている。

  • 32 ビット形式のポインタ・サイズと 64 ビット形式のポインタ・サイズが混在しているアプリケーションに対して, 32 ビット形式または 64 ビット形式の関数を明示的に呼び出すことができる。

  • 32 ビット・アプリケーションと 64 ビット・アプリケーションで 1 つの共用イメージを使用できる。



11.1 DEC C ランタイム・ライブラリの使用

OpenVMS Alpha バージョン 7.0 以降の DEC C ランタイム・ライブラリは, 64 ビット・ポインタを生成し,受け取ることができます。 64 ビット・ポインタを使用する第 2 のインタフェースを必要とする関数は,対応する 32 ビットと同じオブジェクト・ライブラリおよび共用イメージにあります。オブジェクト・ライブラリや共用イメージが新しく作成されることはありません。 64 ビット・ポインタを使用することで,リンク・コマンドやリンク・オプション・ファイルに変更を加える必要はありません。

DEC C 64 ビット環境を使用すると,1 つのアプリケーションの中で 32 ビット・アドレスと 64 ビット・アドレスの両方を使用できます。ポインタ・サイズの操作についての詳細は,『DEC C User's Guide for OpenVMS Systems』の /POINTER_SIZE 修飾子,および #pragma pointer_sizeまたは #pragma required_pointer_sizeプロセッサ・ディレクティブに関する記述を参照してください。

/POINTER_SIZE 修飾子に対して,ユーザは値 32 または 64 を指定します。ここで指定した値は,コンパイル・ユニットの中の省略時の設定のポインタ・サイズとして使用されます。アプリケーション・プログラマは,あるモジュール・セットは 32 ビット・ポインタを使用して,また別のセットは 64 ビット・ポインタを使用してコンパイルします。この 2 つのモジュール・グループがお互いを呼び出す場合,特に注意しなければなりません。

/POINTER_SIZE 修飾子の使用は,DEC C RTL ヘッダ・ファイルの処理にも影響します。 32 ビット実装および 64 ビット実装を持つ関数の場合,修飾子に指定される実際の値に関わらず,/POINTER SIZE 修飾子によって関数プロトタイプは両方の関数にアクセスできます。さらに,修飾子に指定される値は,コンパイル・ユニットの中で呼び出す省略時の設定の実装を決定します。

#pragma pointer_sizeおよび #pragma required_pointer_sizeプロセッサ・ディレクティブは,コンパイル・ユニットの中で使用されるポインタ・サイズを変更します。 32 ビット・ポインタを省略時の設定のポインタとし,モジュール内の特定のポインタを 64 ビット・ポインタとして宣言することができます。 64 ビット・メモリ領域からメモリを取得するために, malloc_malloc64形式を呼び出す必要があります。

11.2 メモリを指す 64 ビット・ポインタの取得

DEC C RTL には,新しく割り当てられたメモリへのポインタを返す関数が数多くあります。これらの各関数の中で,アプリケーションは指されているメモリを所有し,そのメモリを解放する責任があります。

メモリを割り当てる関数は次に示します。

malloc
calloc
realloc
strdup

各関数とも 32 ビット実装および 64 ビット実装を持ちます。 /POINTER SIZE 修飾子が使用される場合,次の関数が呼び出される可能性もあります。

_malloc32, _malloc64
_calloc32, _calloc64
_realloc32, _realloc64
_strdup32, _strdup64

/POINTER_SIZE=32 が指定されると,すべての malloc呼び出しの省略時の設定は _malloc32になります。

/POINTER_SIZE=64 が指定されると,すべての malloc呼び出しの省略時の設定は _malloc64になります。

アプリケーションが 32 ビットまたは 64 ビットのどちらのメモリ割り当てルーチンを呼び出した場合も, free関数があります。この関数はどちらのサイズのポインタも受け取ります。

メモリ割り当て関数は,64 ビット・メモリへのポインタを返す唯一の関数です。 (FILE,WINDOW,DIR などのように)呼び出しアプリケーションに返されるすべての DEC C RTL 構造ポインタは,通常は 32 ビット・ポインタです。このため 32 ビットと 64 ビットの両方の呼び出し側とも,アプリケーションの中でこれらの構造ポインタを渡すことができます。

11.3 DEC C ヘッダ・ファイル

DEC C バージョン 5.2 以降で提供するヘッダ・ファイルは, 64 ビット・ポインタをサポートします。ポインタを含む各関数プロトタイプは,受け取るポインタのサイズを示すように構成されています。

32 ビット・ポインタまたは 64 ビット・ポインタのいずれか 1 つを引数として受け取る関数に対して, 32 ビット・ポインタをその引数として渡すことができます。

しかし,32 ビット・ポインタを受け取る関数への引数として, 64 ビット・ポインタを渡すことはできません。この操作を試みると,コンパイラによって診断が行われ,MAYLOSEDATA メッセージが表示されます。なお,IMPLICITFUNC 診断メッセージが表示された場合,これは,その関数の呼び出しについて,ポインタ・サイズのチェックをこれ以上実行できないことを表します。

特に有効なポインタ・サイズについてのコンパイラの診断メッセージを次に示します。

  • %CC-IMPLICITFUNC
    指定された関数の使用に先立ち,関数プロトタイプが見つからないことを表します。コンパイラおよびランタイム・システムは,プロトタイプ定義に基づいて,不適切なポインタ・サイズの使用を検出します。正しいヘッダ・ファイルがインクルードできないと,不適切な結果が生じたり,ポインタの切り捨てが発生する可能性があります。

  • %CC-MAYLOSEDATA
    この操作を実行するには切り捨てが必要であることを表します。この操作では,指定されたコンテキストの中で 64 ビット・ポインタをサポートしない関数に対して, 64 ビット・ポインタを渡している可能性があります。または関数の戻り値は 64 ビット・ポインタを返し,ソースはその戻り値を 32 ビット・ポインタに保存しようとしている可能性があります。

  • %CC-MAYHIDELOSS
    (有効な場合)このメッセージは,キャスト操作により表示が抑止されている本当の MAYLOSEDATA メッセージを出力することを可能にします。



11.4 影響のある関数

OpenVMS Alpha バージョン 7.0 が提供する DEC C RTL は, 32 ビット・ポインタだけを使用するアプリケーション, 64 ビット・ポインタだけを使用するアプリケーション,または両方を組み合わせて使用するアプリケーションにそれぞれ適応します。 64 ビット・メモリを使用するには,少なくともアプリケーションの再コンパイルと再リンクが必要です。ソース・コードの変更量は,アプリケーション,ほかのランタイム・ライブラリへの呼び出し,使用されているポインタ・サイズの組み合わせによってそれぞれ異なります。

DEC C RTL 関数は,次の 4 種類に分類できます。

  • ポインタ・サイズの選択に影響を受けない関数

  • どちらのポインタ・サイズも受け取れるよう拡張された関数

  • 32 ビット実装と 64 ビット実装を持つ関数

  • 32 ビット・ポインタだけを受け取る関数

アプリケーション開発者の立場からすると,上記の最初の 2 つの関数は単一ポインタ・モードと混合ポインタ・モードのいずれの場合も簡単に使用できます。

3 番目の関数は,単一ポインタ・モードで使用している場合はソース・コードを変更する必要はありません。ただし混合ポインタ・モードで使用している場合は,ソース・コードの変更が必要です。

4 番目の関数は,64 ビット・ポインタを使用している場合は十分な注意が必要です。

11.4.1 ポインタ・サイズの影響がない関数

プロトタイプにポインタに関連するパラメータや戻り値が含まれていない場合,ポインタ・サイズの選択による関数への影響を考慮する必要はありません。算術関数がこれに相当します。

この種類の関数のうち,プロトタイプにポインタを含まない関数は,ポインタ・サイズの選択による影響はありません。たとえば strerror関数のプロトタイプは次のとおりです。


char * strerror (int error_number); 

この関数は文字列へのポインタを返しますが,この文字列は DEC C RTL で割り当てられます。その結果,32 ビット・アプリケーションと 64 ビット・アプリケーションを両方ともサポートするために,この種類のポインタは, 32 ビット・ポインタに対応することが常に保証されています。

11.4.2 両方のポインタ・サイズを受け取る関数

Alpha アーキテクチャは 64 ビット・ポインタをサポートします。 OpenVMS Alpha 呼び出し規則では,すべての引数が 64 ビット値として渡されることを指定しています。 OpenVMS Alpha Version 7.0 より前のバージョンでは,プロシージャに渡される 32 ビット・アドレスはすべて, 64 ビット・パラメータに符号拡張されていました。呼び出された関数はパラメータを 32 ビット・アドレスとして宣言し,これによってコンパイラは 32 ビット命令 (LDL など) を生成して,これらのパラメータを処理していました。

DEC C RTL 内の関数の多くは拡張され, 64 ビット・アドレス全体を受け取るようになりました。関数 strlenを例に考えます。


size_t strlen (const char *string); 

この関数内の唯一のポインタは文字列ポインタです。ユーザが 32 ビット・ポインタを渡すと,関数は符号拡張された 64 ビット・アドレスで動作します。ユーザが 64 ビット・アドレスを渡すと,関数はそのアドレスで直接動作します。

DEC C RTL は引き続き,この種類の関数に対して, 1 つのエントリ・ポイントだけを持ちます。この種類の関数の 4 つのポインタ・サイズ・オプションのいずれを追加する場合も,ソース・コードの変更は必要ありません。OpenVMS マニュアルでは,これらの関数を 64 ビット・フレンドリと呼びます。

11.4.3 2 種類の実装を持つ関数

多くの理由から,関数は,32 ビット・ポインタ用と 64 ビット・ポインタ用に 2 種類の実装を持つ必要があります。その理由を次に示します。

  • 戻り値のポインタ・サイズは,引数の 1 つのポインタ・サイズと同じです。引数が 32 ビットの場合,戻り値は 32 ビットです。引数が 64 ビットの場合,戻り値は 64 ビットです。

  • 引数の 1 つはオブジェクトへのポインタですが,そのオブジェクトのサイズがポインタ・サイズに影響を受けます。指しているバイト数を知るためには,コードが 32 ビット・ポインタ・サイズ・モードと 64 ビット・ポインタ・サイズ・モードのどちらでコンパイルされたのかを知る必要があります。

  • 関数は動的に割り当てられたメモリのアドレスを返します。メモリは 32 ビット・ポインタでコンパイルされた場合は 32 ビット空間に割り当てられ,64 ビット・ポインタでコンパイルされた場合は 64 ビット空間に割り当てられます。

アプリケーション開発者の立場から見ると,これらの各関数にはそれぞれ 3 種類の関数プロトタイプがあります。 <string.h>ヘッダ・ファイルは,その戻り値が先頭引数のポインタ・サイズに依存する多くの関数を持ちます。 memset関数を例に考えます。ヘッダ・ファイルは,この関数に対して 3 つのエントリ・ポインタを定義します。


void * memset   (void *memory_pointer, int character, size_t size); 
void *_memset32 (void *memory_pointer, int character, size_t size); 
void *_memset64 (void *memory_pointer, int character, size_t size); 

最初のプロトタイプは,この関数を使用している場合に,アプリケーションが現在呼び出している関数です。コンパイラは memsetへの呼び出しを, /POINTER_SIZE=32 でコンパイルされているときは _memset32への呼び出しに,また,/POINTER_SIZE=64 コンパイルされているときは _memset64呼び出しにそれぞれ置換します。

関数の 32 ビット形式または 64 ビット形式を直接呼び出すことにより,この省略時の設定の動作を変更することができます。これにより /POINTER_SIZE 修飾子で指定した省略時の設定のポインタ・サイズに関係なく,ポインタ・サイズが混在しているアプリケーションに対応できます。

/POINTER_SIZE 修飾子を指定せずにコンパイルしている場合, 32 ビット固有のインタフェース関数プロトタイプも, 64 ビット固有のインタフェース関数プロトタイプも定義されないことに注意してください。この場合コンパイラは,2 種類の実装を持つインタフェースに対して,自動的に 32 ビット・インタフェースを呼び出します。

DEC C RTL での 64 ビット・ポインタ・サイズのサポートの一環として, 2 種類の実装を持つ関数の一覧を 表 11-1 に示します。 /POINTER_SIZE 修飾子を指定してコンパイルしている場合,修正されていない関数名を呼び出すと,その修飾子で指定されるポインタ・サイズに対応するインタフェースが呼び出されます。

表 11-1 2 種類の実装を持つ関数
basename malloc strpbrk wcsncat
bsearch mbsrtowcs strptime wcsncpy
calloc memccpy strrchr wcspbrk
catgets memchr strsep wcsrchr
ctermid memcpy strstr wcsrtombs
cuserid memmove strtod wcsstr
dirname memset strtok wcstok
fgetname mktemp strtol wcstol
fgets mmap strtoll wcstoul
fgetws qsort strtoq wcswcs
fullname realloc strtoul wmemchr
gcvt rindex strtoull wmemcpy
getcap strcat strtouq wmemmove
getcwd strchr tgetstr wmemset
getname strcpy tmpnam  
gets strdup wcscat  
index strncat wcschr  
longname strncpy wcscpy  


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項