自己再配置

コンピュータプログラミング において、自己再配置プログラムとは、実行時に自身のアドレス依存命令とデータを再配置するプログラムであり、したがって任意のアドレスでメモリにロードすることができます。 [ 1 ] [ 2 ]多くの場合、自己再配置コードは自己変更コードの一種でもあります

概要

自己再配置は、プログラムが外部ストレージからメインメモリにコピーされるときにリンカーローダー)によって使用される再配置プロセスに似ています。違いは、再配置を実行するのは オペレーティングシステムまたはシェルのローダーではなく、ロードされたプログラム自体であるということです

自己再配置の形態の一つは、プログラムが命令のコードを単一のコンピュータの主記憶内のある位置のシーケンスから別の位置のシーケンスにコピーし、その後、プロセッサ制御をメモリのソース位置にある命令からメモリの宛先位置にある命令に移すときに発生します。したがって、プログラムのアルゴリズムによって操作されるデータは、プログラムを定義するバイト列です。

静的自己再配置は、通常、ロード時(オペレーティングシステムがソフトウェアをロードして制御を渡した後、初期化が完了する前)に発生しますが、実行時の後の段階でプログラムの設定を変更するときにも発生することがあります。[ 3 ] [ 4 ]

ブートローダー

例えば、自己再配置は、IBM PC互換機などのアーキテクチャ上のオペレーティングシステムのブートストラップの初期段階でよく使用されます。そこでは、低レベルのチェーンブートローダーマスターブートレコード(MBR)、ボリュームブートレコード(VBR)、 DOSなどのオペレーティングシステムの初期ブートステージなど)が、次のステージをメモリにロードするために、自身を所定の場所から移動します

CP/M拡張

CP/Mでは、デバッガーのダイナミックデバッグツール(DDT)は、プログラム実行のための一時プログラム領域(TPA)を最大化するために、ページ境界の再配置を通じて利用可能なメモリの先頭に動的に再配置しました。 [ 5 ] [ 6 ]

1988年、 Zシステムの代替コマンドラインプロセッサZCPR 3.4は、埋め込みスタブを介して自己再配置可能な、いわゆるタイプ4プログラムを導入しました。 [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ]

x86 DOS ドライバ

DOSでは、アプリケーションで利用できるメモリを最大化するために、より高度なドライバ常駐システム拡張機能(RSX)、または終了して常駐するプログラム(TSR)によって、外部から提供される「高」ローダー ( LOADHIGH / HILOADINSTALLHIGH / HIINSTALLDEVICEHIGH / HIDEVICEなど[ 12 ] DOS 5 以降)よりも効率的に自分自身を上位メモリの「高」にロードすることで、アプリケーションで利用できるメモリを最大化するために使用されることもあります。これは、オペレーティング システムがロードされるドライバの内部動作を認識しないため、初期化コードが初期化後に解放されるとしても、ドライバ全体をブロックとして保持するのに十分な大きさの空きメモリ領域にドライバをロードする必要があるという事実によるものです。TSR の場合、オペレーティング システムはプログラム セグメント プレフィックス(PSP) と環境セグメントも割り当てる必要があります。[ 13 ]これにより、ドライバが最適な空きメモリ領域にロードされないか、上位にロードされなくなる可能性があります。これとは対照的に、自己再配置ドライバはどこにでも(コンベンショナルメモリを含む)ロードでき、その後、(通常ははるかに小さい)常駐部分のみを上位メモリの適切な空きメモリ領域に再配置できます。さらに、高度な自己再配置TSRは(オペレーティングシステムによって上位メモリに既にロードされている場合でも)、独自のPSPセグメントとコマンドラインバッファの大部分を再配置し、環境セグメントを解放して、結果として生じるメモリフットプリントをさらに削減し、断片化を回避できます。[ 14 ]一部の自己再配置TSRは、元々TSRとしてロードされていても、その「性質」を動的に変更してデバイスドライバに変形できるため、通常はメモリの一部も解放されます。[ 4 ]最後に、外部ローダーがドライバーを拡張メモリ(EMS)、ハイメモリ領域(HMA)、または拡張メモリ( DPMSまたはCLOAKING経由)に再配置することは技術的に不可能です。これらの方法では、再配置対象領域へのアクセスを調整するために、従来のメモリまたは上位メモリに小さなドライバー固有のスタブを残す必要があるためです。[ 15 ] [ nb 1 ] [ nb 2 ]デバイスドライバの場合、ドライバのヘッダーは常に最初のメガバイトに残っていなければならないためでもある。[ 15 ] [ 13 ]これを実現するために、ドライバはこれらの領域への自己再配置をサポートするように特別に設計されなければならない。[ 15 ]

一部の高度な DOS ドライバには、デバイス ドライバ (オペレーティング システムによってオフセット +0000h にロードされる) と TSR (オフセット +0100h にロードされる) の両方が含まれており、共通コード部分を内部的にファットバイナリとして共有しています。[ 13 ]共有コードが位置非依存になるように設計されていない場合は、再配置ローダーによって既に実行されているのと同様の何らかの形式の内部アドレス修正が必要です。これは、自己再配置の修正段階に似ていますが、コードはオペレーティング システムのローダーによって既にターゲットの場所にロードされています (ドライバ自体によって行われるのではなく)。

IBM DOS/360 および OS/360 プログラム

IBM DOS/360には、ロード中にプログラムを再配置する機能はありませんでした。プログラムには複数のバージョンが保持され、それぞれが異なるロードアドレス(パーティション)用に構築されることもありました。自己再配置プログラムと呼ばれる特別なクラスのプログラムは、ロード後に自身を再配置するようにコーディングされていました。[ 16 ] IBM OS/360は、実行可能プログラムをメモリにロードする際に再配置しました。プログラムのコピーは1つだけ必要でしたが、一度ロードされるとプログラムは移動できませんでした(いわゆるワンタイム位置独立コード)。

その他の例

(多数回)自己再配置(動的自己再配置とも呼ばれる)の極端な例として、ワームメモリテストで使用されるように、実行中でもメモリ内の固定アドレスに留まらないようにコンピュータプログラムを構築することが可能です [ 17 ] [ 18 ] [ 19 ] [ 20 ] Apple Worm動的自己再配置プログラムです。[ 21 ]

参照

注記

  1. スタブの要件の例外は、拡張メモリがメモリマネージャによってEMSUMBを介して永続的な上位メモリに変換され EMS経由ではなく上位メモリとして実質的にアクセスされる場合です
  2. ^ドライバをHMAにロードするためのスタブ要件には、例外が 2 つあります。ゲート A20ロジックのないマシンでハイ メモリが永続的に有効になっている場合、スタブは必要ありません。ただし、この条件は一般に満たされないため、汎用 DOS ドライバはそれを利用できません (事前にこの条件を明示的にテストする場合を除く)。それ以外の場合、常駐システム拡張機能 ( SHARENLSFUNCなど) が多重割り込み INT 2Fh のみをフックする場合、 DR DOS 6.0以上でもスタブは必要ありません。これは、バックドア インターフェイスを使用してカーネル空間の割り込みチェーンにフックし、カーネルのゲート A20 ハンドラがスタブの機能を提供できるためです。 [a]それでも、ドライバは HMA で正しく機能するために自己再配置を実行する必要があります。

参考文献

  1. ^ Dhamdhere, Dhananjay M. (1999).システムプログラミングとオペレーティングシステム. 教育. ニューデリー、インド: Tata McGraw-Hill . p. 232. ISBN 0-07-463579-4. ISBN 978-0-07-463579-7. 2020年2月1日にオリジナルからアーカイブ2011年11月8日閲覧(658ページ)
  2. ^ダムデレ、ダナンジェイ・M.(2006年)『オペレーティングシステム:概念に基づくアプローチ』教育出版。インド・ニューデリー:タタ・マグロウヒル。231ページ。ISBN 0-07-061194-7. ISBN 978-0-07-061194-82020年2月20日にオリジナルからアーカイブ2020年2月20日閲覧(799ページ)
  3. ^ Paul, Matthias R.; Frinke, Axel C. (1997-10-13) [1991], FreeKEYB - 拡張DOSキーボードおよびコンソールドライバ(ユーザーマニュアル)(6.5版)[1] (NB. FreeKEYB はUnicodeベースの動的に構成可能なドライバーで、ほとんどのキーボード レイアウトコード ページ国コードをサポートしています。既製のマクロ アセンブラーと、依存関係とコードモーフィングのメタデータを生成して実行ファイルにバイナリ コードとともに埋め込む自動前後処理分析ツールのフレームワーク、および自己破棄、緩和再配置ローダーを使用することで、このドライバーはさまざまな方法でロードして TSR またはデバイス ドライバーとしてインストールすることができ、高度な自己再配置手法 (通常のDOS メモリUMB、未使用のビデオ メモリ、または生のメモリへのインストールに加え、プログラム セグメント プレフィックスのオーバーロードと環境セグメントの再結合も利用) と、ロード時のバイトレベルのきめ細かい動的デッド コード除去、およびハードウェア、オペレーティング システム、ドライバーの構成、選択した機能セットとロケールに応じてメモリ フットプリントを最小限に抑えるための実行時の自己変更コードと再構成を実装しています。)
  4. ^ a b Paul, Matthias R.; Frinke, Axel C. (2006-01-16)、FreeKEYB - 高度な国際 DOS キーボードおよびコンソール ドライバー(ユーザー マニュアル) (7 (暫定) 版)
  5. ^キルドール、ゲイリー・アーレン(1978年2月)[1976]. 「絶対マシンコードの静的再配置のための簡単な手法」 . Dr. Dobb's Journal of Computer Calisthenics & Orthodontia . 3 (2). People's Computer Company : 10–13 (66–69). ISBN 0-8104-5490-4. #22 ark:/13960/t8hf1g21p . 2017年8月19日閲覧[2] [3] [4]。元々はKildall, Gary Arlen (1977) [1976年11月22~24日]に発表された。「絶対マシンコードの静的再配置のための単純な手法」。米国カリフォルニア州モントレーの海軍大学院で執筆。Titus, Harold A. (編) 著。会議記録:第10回アシロマ回路・システム・コンピュータ会議:1976年11月22~24日に発表された論文。アシロマホテル&カンファレンスグラウンド、カリフォルニア州パシフィックグローブ、米国:Western Periodicals Company。pp.  420~ 424。ISSN 1058-6393 。 2021年12月6閲覧 (609ページ)。 (ページ境界再配置と呼ばれるこの「サイズ変更」方法は、プログラム実行のTPA を最大化するために、MOVCPMを使用してCP/M-80ディスク イメージに静的に適用できます。また、CP/M デバッガのDynamic Debugging Tool (DDT) によって、自身を上位メモリに再配置するために動的に利用されました。同じアプローチは、再配置可能なPL/Mコードを生成するために、IMS AssociatesBruce H. Van Nattaによって独立して開発されました。段落境界再配置として、この方法の別のバリエーションが、DR DOS 6.0以降でKEYBSHARE、およびNLSFUNCなどの動的HMA自己再配置 TSRによって後に利用されました。やや似たアプローチに基づく、はるかに洗練されたバイト レベルの細分化されたオフセット再配置方法は、動的デッド コード除去のために Matthias R. Paul と Axel C. Frinke によって独立して考案および実装され、常駐ドライバおよび TSR (FreeKEYB など)
  6. ^ Huitt, Robert; Eubanks, Gordon ; Rolander, Thomas "Tom" Alan ; Laws, David; Michel, Howard E.; Halla, Brian; Wharton, John Harrison ; Berg, Brian; Su, Weilian; Kildall, Scott ; Kampe, Bill (2014-04-25). Laws, David (ed.). "Legacy of Gary Kildall: The CP/M IEEE Milestone Dedication" (PDF) (ビデオ・トランスクリプション). Pacific Grove, California, USA: Computer History Museum . CHM Reference number: X7170.2014. Archived (PDF) from the original on 2014-12-27 . Retrieved 2020-01-19 . […] Laws: […] OSの動的再配置」とは何ですか?なぜ重要だったのでしょうか? 【略】ユーバンクス氏:【略】ゲイリーのやったことは【略】、まさに驚異的でした。【略】学校で彼が研究室に飛び込んできて、「再配置のやり方がわかった」と言った日のことを覚えています。彼は、唯一のバイトは常に上位バイトになるという事実を利用しました。そこで彼はビットマップを作成しました。【略】コンピュータのメモリ容量は関係なく、オペレーティングシステムは常に上位メモリに移動できました。そのため、メモリ容量の異なるマシンでこれを商品化できました。【略】64K CP/Mと47K CP/Mを販売することはできません。アドレスにハードコンパイルを組み込むのは馬鹿げています。そこでゲイリーはある晩、おそらく真夜中に何かコーディングのことを考えながらこれを思いつき、これがCP/Mの商品化を本当に可能にしたのです。あの再配置がなければ、非常に難しい問題になっていただろうと本当に思います。人々にそれを買ってもらおうとすると、複雑に思われるでしょうし、メモリを増設するとなると別のオペレーティングシステムを買わなければならないでしょう。[…] Intel […]はメモリアドレスのバイトを反転させていました。しかし、それらは常に同じ場所にあったので、正確には256バイト境界で再配置することができました。つまり、それらのビットマップだけでいつでも再配置できるのです[…] Laws: 動的再配置について、これまで聞いた中で最も説得力のある説明でした[…][5] [6](33ページ)
  7. ^ Sage, Jay (1988年5~6月). Carlson, Art (編). 「ZCPR 3.4 - タイプ4プログラム」 . The Computer Journal (TCJ) - プログラミング、ユーザーサポート、アプリケーション. ZCPR3コーナー (32). コロンビアフォールズ, モンタナ州, 米国: 10~17. ISSN 0748-9331 . ark:/13960/t1wd4v943 . 2021年11月29日閲覧 [7] [8]
  8. ^ミッチェル、ブリッジャー(1988年7~8月)。カールソン、アート(編)「Z3PLUSと再配置 - ZCPR3PLUSに関する情報、および自己再配置Z80コードの書き方」コンピュータジャーナル(TCJ) - プログラミング、ユーザーサポート、アプリケーション。Advanced CP/M(33)。米国モンタナ州コロンビアフォールズ:9~15。ISSN 0748-9331。ark :/13960/t36121780。2020年2月9閲覧 [9] [10]
  9. ^ Sage, Jay (1988年9~10月). Carlson, Art (編). 「再配置可能コード、PRLファイル、ZCPR34、およびタイプ4プログラムについての詳細」 . The Computer Journal (TCJ) - プログラミング、ユーザーサポート、アプリケーション. ZCPR3コーナー (34). 米国モンタナ州コロンビアフォールズ: 20~25. ISSN 0748-9331 . ark:/13960/t0ks7pc39 . 2020年2月9日閲覧 [11] [12] [13]
  10. ^ Sage, Jay (1992年1月~2月). Carlson, Art; McEwen, Chris (編). 「ZCPRの10年間」 . The Computer Journal (TCJ) - プログラミング、ユーザーサポート、アプリケーション. Z-System Corner (54). S. Plainfield, New Jersey, USA: Socrates Press: 3 –7. ISSN 0748-9331 . ark:/13960/t89g6n689 . 2021年11月29日閲覧。 [14] [15] [16]
  11. ^ Sage, Jay (1992年5~6月) [1992年3~6月]. Carlson, Art; McEwen, Chris (編). 「Type-3 and Type-4 Programs」 . The Computer Journal (TCJ) - プログラミング、ユーザーサポート、アプリケーション. Z-System Corner - Some New Applications of Type-4 Programs (55). S. Plainfield, New Jersey, USA: Socrates Press: 13 –19. ISSN 0748-9331 . ark:/13960/t4dn54d22 . 2021年11月29日閲覧 [17] [18]
  12. ^ 「第10章 メモリの管理」 . Caldera DR-DOS 7.02 ユーザーガイド. Caldera, Inc. 1998 [1993, 1997]. 2017年8月30日時点のオリジナルよりアーカイブ。2017年8月30日閲覧
  13. ^ a b c Paul, Matthias R. (2002-04-06). "Re: [fd-dev] ANNOUNCE: CuteMouse 2.0 alpha 1" . freedos-dev . 2020-02-07にオリジナルからアーカイブ。2020-02-07に取得。 [ …] CTMOUSEが1つに、通常のTSRとデバイスドライバーの両方を使用できるように、ドライバーにSYSデバイスドライバーヘッダーを追加します。これは、FreeKEYBアドバンスドキーボードドライバーに似ています。 […] INSTALL =はDR DOS 3.41以降でサポートされており、DR DOSは[D]CONFIG.SYSディレクティブの順序を保持するため、 DR DOSでは実際には必要ありません。 […] しかし、 […] MS-DOS / PC DOSシステムでの柔軟性が向上します。[ […] ファイル内の順序に関係なく、常にINSTALL =ステートメントよりも前にDEVICE =ディレクティブが実行されます。 […] ソフトウェアは、マウスドライバをデバイスドライバとして提供することを要求する場合があります。これは、昔からマウスドライバは常にデバイスドライバであったためです。これらのマウスドライバは、使用するプロトコルに応じて固有のデバイスドライバ名(例えば、マウスシステムモードの場合は「 PC$MOUSE)を持っており、一部のソフトウェアは、使用するマウスの種類を特定するためにこれらのドライバを検索する場合があります。[…] もう1つの利点は、デバイスドライバは通常、メモリ消費量が少ないことです(環境変数やPSPは不要)。[…] これは基本的に、扱いにくいファイルヘッダー、コマンドラインを解析するための別のコード、異なるエントリポイントと終了行、そしてORG 0 / ORG 100hの違いを克服するためのいくつかのセグメントマジックです。デバイスドライバの自己ロードハイディングは、ドライバヘッダーをそのままにして、ドライバの残りの部分のみを再配置する必要があるため、少し扱いに​​くくなります。[…]
  14. ^ Paul, Matthias R. (2001-08-18). 「Re: [fd-dev] On GRAFTABL and DISPLAY.SYS (Was: Changing codepages in FreeDOS)」 . freedos-dev . 2017-09-04にオリジナルからアーカイブ。2017-09-04に取得。 [ …] 少なくともMS-DOS 6.0以降のGRAFTABLは、 PSPセグメントの一部(オフセット+60h以上)を再配置することで、そのサイズを最小限に抑えます。[…](注: DR-DOS 7.03以降のGRAFTABL 2.00+ も動的自己再配置をサポートしています。)
  15. ^ a b cPaul, Matthias R. (2002-02-02). "Treiber dynamisch nachladen" [ドライバの動的ロード] (ドイツ語).ニュースグループde.comp.os.msdos .オリジナルから2017年9月9日にアーカイブ。 2017年7月2日閲覧(注: LOADHIGHなどのコマンドの使用法や、 XMSUMB APIを利用したUMBへの自己再配置方法など、DOS でのロードハイ方式の概要を示します。また、セグメント内オフセット再配置を利用してTSR をHMAに再配置するために必要な、より高度な方法についても説明します。)
  16. ^ Boothe Management Systems (1972-11-01). 「スループット - 期待通りの成果が得られていますか? - DOSRELO」 . Computerworld - The Newsweekly For The Computer Community (広告). 第6巻、第44号。米国カリフォルニア州サンフランシスコ:Computerworld, Inc. p. 9. 2020年2月6日時点のオリジナルよりアーカイブ。 2020年2月7日閲覧。 […] DOSRELOは、 DOSの問題プログラムを自己再配置化する手法を提供します。DOSRELOは、リンケージエディターがコアイメージライブラリにカタログ化する前に、プログラムのオブジェクトコードにエントリポイントロジックを追加することで、言語に関係なくすべてのプログラムに自己再配置機能を実現します。[…]
  17. ^ワームメモリテスト(PDF) .ベクターグラフィック. 2015年10月21日 . 2019年5月15日時点のオリジナルよりアーカイブ(PDF) . 2021年12月13日閲覧(3 ページ) (注: Vector Graphic 3 のサービス マニュアルより)
  18. ^ Wilkinson, William "Bill" Albert (2003) [1996, 1984]. 「H89ワーム:H89のメモリテスト」 . Bill Wilkinson's Heath Company Page .オリジナルから2021年12月13日にアーカイブ。 2021年12月13日閲覧。 […] Z80は命令フェッチに加えて、サイクルの半分をダイナミックRAMのリフレッシュに使用します[ ] Z80は各命令フェッチサイクルの半分を他の処理に費やす必要があるため、命令バイトのフェッチ時間はデータバイトのフェッチ時間ほど長くありません。アクセス対象のメモリ位置にあるRAMチップの1つが少しでも遅い場合、Z80は命令フェッチ時に誤ったビットパターンを取得する可能性がありますが、データ読み取り時には正しいビットパターンを取得する可能性があります。[…] 内蔵メモリテストではこの種の問題は検出されません[…] これは厳密にはデータの読み書きテストです。テスト中、すべての命令フェッチはRAMではなくROMから行われます[…] その結果、H89はメモリテストに合格しますが、一部のプログラムでは依然として不安定な動作をします。[…] これは、RAMを介して自身を再配置することでメモリをテストするプログラムです。その際、CPUはプログラムの現在のアドレスをCRTに表示し、そのアドレスにある命令をフェッチします。そのアドレスのRAM ICに問題がなければ、CPUはテストプログラムを次のメモリ位置に再配置し、新しいアドレスを表示して、この手順を繰り返します。しかし、RAM ICの1つが低速で誤ったビットパターンを返す場合、CPUは命令を誤って解釈し、予期しない動作をします。ただし、ディスプレイがロックアップし、故障したICのアドレスが表示される可能性があります。これにより、問題となるICを8個に絞り込むことができ、最大32個ものICをチェックする必要があった場合に比べて改善されます。[…] この[…]プログラムは、RST 7(RESTART 7)命令をメモリの下位から最後の作業アドレスまでプッシュすることでワームテストを実行します。プログラムの残りの部分は静止したまま、RST 7コマンドの現在位置の表示と再配置を処理します。ちなみに、このプログラムがワームテストと呼ばれるのは、RST 7命令がメモリを上位に移動する際に、 NOP (NO OPERATION)命令の痕跡が残るためです。[…]
  19. ^ Steinman, Jan W. (1986-09-01). 米国オレゴン州ウェストリンで執筆。「ワームメモリテスト」。The Right to Assemble (TRTA). Dr. Dobb's Journal of Software Tools for the Professional Programmer . 11 (9). 米国カリフォルニア州レッドウッドシティ: M&T Publishing, Inc. / The People's Computer Company : 114–115 (662–663). ISSN 1044-789X . #119. ark:/13960/t74v34p9p CODEN DDJOEB . 2021年12月13日閲覧。  [19] (2ページ)
  20. ^スタインマン、ジャン・W. (1986). 「III. 68000の便利なルーチンとテクニック、16. ワームメモリテスト」(PDF) . 執筆は米国オレゴン州ウェストリンにて。『Dr. Dobb's Toolbook of 68000 Programming』。米国ニューヨーク州: Brady Book / Prentice Hall Press / Simon & Schuster, Inc. pp.  341– 350. ISBN 0-13-216649-6 LCCN  86-25308 2021年12月13日時点のオリジナルからアーカイブ(PDF)2021年12月13日閲覧(1+5+10+1ページ)
  21. ^デュードニー、アレクサンダー・キーワティン(1985年3月)。「コンピュータレクリエーション - ウイルス、ワーム、その他のコンピュータメモリへの脅威に関するコアウォーのベストイアリー」。サイエンティフィックアメリカン。285 : 38–392017年7月4日時点のオリジナルよりアーカイブ2017年7月4日閲覧

参考文献