本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

MOVE オーバーレイの使用方法

文書番号: 402070

最終更新日: 2004/04/27


この資料は以下の製品について記述したものです。


概要

このドキュメントでは、マニュアルの付加情報として以下の項目について説明をし
ます。
マニュアル『 Environment and Utilities 』などもあわせて、参照してください。
  1. MOVE オーバーレイの制限事項
  2. 関数単位での MOVE オーバーレイモジュール作成手順
  3. 関数単位での MOVE オーバーレイサンプル
  4. コードセグメント単位での DEF ファイルの記述サンプル
  5. オーバーレイ Q&A

詳細

1. MOVE オーバーレイの制限事項

  • オーバーレイに置くことのできる論理セグメント数  16,383
  • オーバーレイの最大個数  2047
  • オーバーレイ間での呼びだしのネスト  64
  • メモリモデルは、ラージ・ミディアム・ヒュージにかぎります
  • データセグメントはオーバーレイできません
  • P-CODE と オーバーレイを同時に使用することはできません
  • Graphics ライブラリはオーバーレイ対応していないので、プロセス終了時にオーバー レイキャッシュをクリア ( _movepause 関数 「 5. オーバーレイ Q&A 」参照 ) する必要があります
  • セグメントオーバーレイとコンパイルオプション /Gy は、併用できません

2. 関数単位での MOVE オーバーレイモジュール作成手順

コンパイル手順

コンパイルオプション/Gy を指定してコンパイルする。
オーバーレイに置くことのできる関数は、パッケージ化された関数に限ります。関数 をパッケージ化してコンパイルするオプションとして、/Gy がありますので、このコン パイルオプションにて、各ソースプログラムをコンパイルします。
例 )   cl /Gy /c /AL xxx.c
メモリモデルは、メディアム・ラージ・ヒュージを指定する。
オーバーレイプログラムにすることができるのは、複数のコードセグメントをもつこと のできるメモリモデルに限ります。

リンク手順

リンク時に必ず DEF ファイルを指定してリンクします。
また、/INFO オプションを指定すると、オーバーレイ間のコール数を知ることがで
きます。デフォルトでは、この数は、256 に制限されていますが、/DYNAMIC オプシ
ョンを使用することにより、 1 - 10,922 までの指定をすることができます。 オー
バーレイ間のコールが最大値をこえている場合、 "too many interoverlay calls" のエラーが発生します。
このような場合は、/DYNAMIC オプションを指定する必要があります。

DEF ファイルの記述方法

オーバーレイの指定は、リンク時に指定する DEF ファイルに記述します。ファンク
ション単位でのオーバーレイを行う場合は、DEF ファイル中に FUNCTIONS ステート
メントを記述します。この指定で、パッケージ化された関数をオーバーレイに置く
ことができます。
FUNCTIONS ステートメントの書式は以下のようになります、
     FUNCTIONS: オーバーレイ番号 パッケージ化されたファンクション名
  FUNCTIONS ステートメントの記述例)
     FUNCTIONS:1 _func0 _func1 _func2 _func3 _func4
この記述で、_func0 - _func4 は、オーバーレイ1に置かれます。
このときに、ファンクション名の指定は、C でコンパイルした場合、アンダーバー
が付加されることに注意してください。

MAP ファイルでの確認

オーバーレイを使用したプログラムから得られる map ファイルで実際のオーバーレ
イ状況が確認できます。
EXEHDR ユーテリテイでの常駐サイズの確認 。
オーバーレイされているプログラムでは、ロード時に必要となるメモリ量を EXEHDR
ユーティリティーを使用して、確認することができます。
Memory needed : 項目に必要メモリ量が表示されます。
   例) exehdr vmain.exe
  Microsoft (R) EXE File Header Utility  Version 3.00
  Copyright (C) Microsoft Corp 1985-1992.  All rights reserved.
   .EXE size (bytes)         a6123
  Magic number:             5a4d
  Bytes on last page:       00c9
  Pages in file:            005a
  Relocations:              004d
  Paragraphs in header:     0020
  Extra paragraphs needed:  019f
  Extra paragraphs wanted:  ffff
  Initial stack location:   0b33:177c
  Word checksum:            0000
  Entry point:              0272:0ba5
  Relocation table address: 001e
  Memory needed:            51K

3. 関数単位での MOVE オーバーレイサンプル

ファンクション単位のオーバーレイ機能を使用して、10 個のオーバーレイ
モジュールを含む EXE (VMAIN.EXE ) を作成するサンプルです。
ov0-ov9 ファイルには、func0 - func9 があり、順番にコールしています。
  ------------------------  MAKEFILE ------------------------------
  all : vmain.exe
  .c.obj :
          cl /Gy /AL /c /f $<
  .obj.exe :
          link /ST:6012 @objlst
  vmain.exe : ov0.obj ov1.obj ov2.obj ov3.obj ov4.obj ov5.obj \
  ov6.obj ov7.obj ov8.obj ov9.obj
  # C dependency as follows
  vmain.obj : vmain.c
  ov0.obj  : ov0.c
  ov1.obj  : ov1.c
  ov2.obj  : ov2.c
  ov3.obj  : ov3.c
  ov4.obj : ov4.c
  ov5.obj : ov5.c
  ov6.obj : ov6.c
  ov7.obj : ov7.c
  ov8.obj : ov8.c
  ov9.obj : ov9.c
  -------------------------  objlst -------------------------------
  /INFO /DYNAMIC:512 vmain.obj +
  ov0.obj +
  ov1.obj +
  ov2.obj +
  ov3.obj +
  ov4.obj +
  ov5.obj +
  ov6.obj +
  ov7.obj +
  ov8.obj +
  ov9.obj ,,,,ov.def
  -------------------------  OV.DEF ---------------------------------
  FUNCTIONS:0 _func0 _func1 _func2 _func3 _func4
  FUNCTIONS:1 _func5 _func6 _func7
  FUNCTIONS:2 _func8 _func9
結果マップ。
オーバーレイには、COMDAT_SEGx の セグメントが割り当てられます。実際の動作時
には、このセグメント単位でオーバーレイされます。
  -----------------------  VMAIN.MAP ------------------------------
   Start  Stop   Length Name                   Class
   Resident
   00000H 00000H 00000H VMAIN_TEXT             CODE
   00000H 00000H 00000H OV0_TEXT               CODE
   00000H 00000H 00000H OV1_TEXT               CODE
   00000H 00000H 00000H OV2_TEXT               CODE
   00000H 00000H 00000H OV3_TEXT               CODE
   00000H 00000H 00000H OV4_TEXT               CODE
   00000H 00000H 00000H OV5_TEXT               CODE
   00000H 00000H 00000H OV6_TEXT               CODE
   00000H 00000H 00000H OV7_TEXT               CODE
   00000H 00000H 00000H OV8_TEXT               CODE
   00000H 00000H 00000H OV9_TEXT               CODE
  .
  .
  .
   06110H 0788BH 0177CH STACK                  STACK
   Overlay 1H
   00000H 01768H 01769H COMDAT_SEG2            CODE
   Overlay 2H
   00000H 00F95H 00F96H COMDAT_SEG3            CODE
   Origin   Group
   0592:0   DGROUP
  Segments              61
  Groups                1
  Bytes in symbol table  26199
  Overlays               3

4.コードセグメント単位での DEF ファイル記述サンプル

MOVE オーバーレイは、DEF ファイル中に SEGMENTS 文を指定することにより、コー
ドセグメント単位での、オーバーレイを実現することができます。
この例では、a b c d e f の 6 つのオブジェクトファイルのうち、
  a はルート
  b,c,d は Overlay 1
  e,f は  Overlay 2
に配置します。obj は、/AL /c でコンパイルしてあります。
  link /map a+b+c+d+e+f,,,,test.def
DEF ファイルの記述は、例 1 , 2, 3 共に同様の結果が得られます。
  TEST.DEF の例
  -- 例1--
  SEGMENTS A_TEXT OVL:0
  SEGMENTS B_TEXT OVL:1 C_TEXT OVL:1 D_TEXT OVL:1 E_TEXT  OVL:2 F_TEXT OVL:2
  -- 例2 --
  SEGMENTS A_TEXT OVL:0
  SEGMENTS B_TEXT OVL:1
  SEGMENTS C_TEXT OVL:1
  SEGMENTS D_TEXT OVL:1
  SEGMENTS E_TEXT OVL:2
  SEGMENTS F_TEXT OVL:2
  -- 例3 --
  SEGMENTS A_TEXT OVL:0 B_TEXT OVL:1 C_TEXT OVL:1 D_TEXT OVL:1 E_TEXT  OVL:2
   F_TEXT OVL:2
  << 実行結果 A.MAP >>
   Overlay 1H
   00000H 00026H 00027H B_TEXT                 CODE
   00028H 0004EH 00027H C_TEXT                 CODE
   00050H 00076H 00027H D_TEXT                 CODE
   Overlay 2H
   00000H 00026H 00027H E_TEXT                 CODE
   00028H 0004EH 00027H F_TEXT                 CODE

5. MOVE オーバーレイに関する Q&A

Q. オーバーレイプログラム実行時に R6801 エラーが発生します。原因と回避法は? A. オーバーレイ間で呼び出しをおこなった場合に、オーバーレイスタックエリアに
呼び出し側の情報を保存します。オーバーレイ間での呼び出しが重なると R6801
Overlay Stack Overflow エラーとなります。このエラーが発生した場合、DEF フ
ァイルでオーバーレイの構成を変える必要があります。オーバーレイ数の削減・
オーバーレイ間コールの削減。
Q. オーバーレイを使用した実行ファイルで、execl 関数で別モジュールを呼び出し、 終了すると、オーバーレイで使用された、XMS メモリが解放されずにプロセス終了を してしまいます。原因と対応は?
A. 原因: MOVE オーバーレイで使用したオーバーレイキャッシュの解放は、MOVE オー バーレイを使用しているプロセスの終了処理でおこなわれるため、子プロセスを呼び 出すとこの処理が実行されず、XMS は確保されたままとなってしまいます。
解決法: execl などの子プロセス起動関数を呼び出す前に、_movepause 関数を呼び 出して、オーバーレイキャッシュを解放しておく必要があります。
  例)
        _movepause(); // オーバーレイキャッシュの解放
        execl( "child.exe", NULL,NULL);//子プロセスの起動
また、プログラム中でグラフィックライブラリを使用している場合も、XMS メモリ
が残りますが、これはグラフィックルーチンの終了処理で、オーバーレイキャッシュ のクリアをおこなっていないためです。この場合もプロセス終了前に _movepause
を呼び出すことで、回避できます。
Q. L1043 エラー(再配置テーブルのオーバーフロー)が発生したが、MOVE オーバー レイを使用しているために、/E オプションで回避できません。対処方法はあります
か?
A. /E オプション以外にも L1043 を回避する方法があります。
  • LINK オプションで /FARCALL を指定して、far 呼び出しの最適化を行う。
  • LINK オプションで /PACKDATA を指定して、データセグメントをパックする。
  • CL オプションで /Gt を指定し、プログラムが動作する範囲で、できるだけ大きな 値を設定する。
  • CL オプションで /Gy (関数ごとのリンクを有効)を指定している場合は、その指定 を止めて、定義ファイル(.DEF )中で SEGMENTS ステートメントでオーバーレイの 数を直接指定する。(例: SEGMENTS FILE_TEXT OVL:3 )
Q. MOVEINIT.OBJ をリンクすると L2029 のエラーが発生します。対策は?
  -------------- エラー内容 -----------------------
  Microsoft (R) Segmented Executable Linker  Version 5.31
  Copyright (C) Microsoft Corp 1984-1992.  All rights reserved.
  d:\c700\lib\moveinit.obj(moveinit.c) : error L2029: '__movesegenv' :
    unresolved external
  There was 1 error detected
A. MOVE_ENV を定義して作成した moveinit.obj をリンクすると L2029 のエラーとなり ます。これは、MOVE_ENV を定義することにより extern 宣言される _movesegenv の 実体が、標準ライブラリではなくライブラリ movetr.lib にふくまれているためで
す。link するときに、movetr.lib をリンクすると、このエラーを回避することがで きます。

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: KBHOWTO KB402070
Technology: kbAudDeveloper kbvc150 kbVCsearch kbZNotKeyword3 kbZNotKeyword8

inserted by FC2 system