コンピュータプログラミング において、自己再配置 プログラムとは、実行時に自身のアドレス依存命令とデータを再配置する プログラムであり、したがって任意のアドレスでメモリにロードすることができます。 [ 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 / HILOAD 、INSTALLHIGH / HIINSTALL 、DEVICEHIGH / 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 ]
参照
注記
参考文献 ^ 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ページ)^ ダムデレ、ダナンジェイ・M. (2006年) 『オペレーティングシステム:概念に基づくアプローチ 』教育出版。インド・ニューデリー: タタ・マグロウヒル 。231ページ 。ISBN 0-07-061194-7 . ISBN 978-0-07-061194-8 2020年2月20日にオリジナルからアーカイブ 。2020年2月20日 閲覧 (799ページ)^ Paul, Matthias R.; Frinke, Axel C. (1997-10-13) [1991], FreeKEYB - 拡張DOSキーボードおよびコンソールドライバ (ユーザーマニュアル)(6.5版) [1] (NB. FreeKEYB はUnicode ベースの動的に構成可能なドライバーで、ほとんどのキーボード レイアウト 、コード ページ 、国コードをサポートしています。既製の マクロ アセンブラー と、依存関係とコードモーフィングの メタデータを生成して 実行ファイルに バイナリ コード とともに埋め込む自動前後処理分析ツールのフレームワーク、および自己破棄、緩和 、再配置ローダー を使用することで、このドライバーはさまざまな方法でロードして TSR またはデバイス ドライバー としてインストールすることができ、高度な自己再配置手法 (通常のDOS メモリ 、UMB 、未使用のビデオ メモリ 、または生のメモリへのインストールに加え、プログラム セグメント プレフィックスの オーバーロードと環境セグメントの再結合も利用) と、 ロード時 のバイトレベルのきめ細かい動的デッド コード除去、 およびハードウェア、オペレーティング システム、ドライバーの構成、選択した機能セットとロケールに応じてメモリ フットプリントを最小限に抑えるための実行時の 自己変更コード と再構成を実装しています。)^ a b Paul, Matthias R.; Frinke, Axel C. (2006-01-16)、 FreeKEYB - 高度な国際 DOS キーボードおよびコンソール ドライバー (ユーザー マニュアル) (7 (暫定) 版) ^ キルドール、ゲイリー・アーレン (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 Associates のBruce H. Van Natta によって独立して開発されました。段落境界再配置 として、この方法の別のバリエーションが 、DR DOS 6.0 以降でKEYB 、SHARE 、およびNLSFUNCなどの動的 HMA 自己再配置 TSRによって後に利用されました。やや似たアプローチに基づく、はるかに洗練されたバイト レベルの細分化されたオフセット再配置方法は、 動的デッド コード除去 のために Matthias R. Paul と Axel C. Frinke によって独立して考案および実装され、常駐ドライバおよび TSR (FreeKEYB など)^ 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ページ)^ 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] ^ ミッチェル、ブリッジャー(1988年7~8月)。カールソン、アート(編) 「Z3PLUSと再配置 - ZCPR3PLUSに関する情報、および自己再配置Z80コードの書き方」 。 コンピュータジャーナル (TCJ) - プログラミング、ユーザーサポート、アプリケーション 。Advanced CP/M(33)。米国モンタナ州コロンビアフォールズ: 9 ~15。ISSN 0748-9331。ark :/13960/t36121780。2020年 2月 9 日 閲覧 [9] [10] ^ 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] ^ 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] ^ 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] ^ 「第10章 メモリの管理」 . Caldera DR-DOS 7.02 ユーザーガイド . Caldera, Inc. 1998 [1993, 1997]. 2017年8月30日時点の オリジナル よりアーカイブ。 2017年8月30日 閲覧 ^ 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の違いを克服するためのいくつかのセグメントマジックです。デバイスドライバの自己ロードハイディングは、ドライバヘッダーをそのままにして、ドライバの残りの部分のみを再配置する必要があるため、少し扱いにくくなります。[…] ^ 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+ も動的自己再配置をサポートしています。)^ a b c Paul, 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に再配置するために必要な、 より高度な方法 についても説明します。)^ 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は、 リンケージエディターが コアイメージライブラリ にカタログ化する 前に、プログラムの オブジェクトコード にエントリポイントロジックを追加することで、言語に関係なくすべてのプログラムに自己再配置機能を実現します。[…] ^ ワームメモリテスト (PDF) . ベクターグラフィック . 2015年10月21日 . 2019年5月15日時点のオリジナルより アーカイブ (PDF) . 2021年12月13日 閲覧 。 (3 ページ) (注: Vector Graphic 3 の サービス マニュアルより)^ 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)命令の 痕跡 が残るためです 。[…] ^ 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ページ)^ スタインマン、ジャン・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ページ)^ デュードニー、アレクサンダー・キーワティン (1985年3月)。 「コンピュータレクリエーション - ウイルス、ワーム、その他のコンピュータメモリへの脅威に関するコアウォーのベストイアリー」 。サイエンティフィック ・ アメリカン 。285 : 38–39 。 2017年7月4日時点のオリジナルより アーカイブ 。 2017年7月4日 閲覧
参考文献 Harrell III, John B. (1983年10月). 「DOSPLUS 3.5」 . 80 Micro . Review (45). 1001001, Inc. : 160, 162, 164–168 , 170. ISSN 0744-7868 . ark:/13960/t8z906r42 . 2020年2月 6日閲覧 [20] [21] スミス、リー、ヘインズ、ライオネル (1989年2月2日) [1987年8月14日]. RISC OS アプリケーションイメージフォーマット(旧アーサーイメージフォーマット) (技術覚書)(1.00版)。ケンブリッジ、英国:エイコーン・コンピューターズ・リミテッド 、プログラミング言語グループ。PLG-AIF。2017年8月30日時点のオリジナルよりアーカイブ 。2017年8月30日 閲覧 ARMイメージフォーマットのプロパティ 。1993年。2017年8月31日時点のオリジナルよりアーカイブ。 2017年8月31日 閲覧 。Huck, Alex (2016-08-14). "Nachladbare Treiber unter CP/M - PRL2COM" . Homecomputer DDR (ドイツ語). 2020年2月21日時点のオリジナルよりアーカイブ。 2020年2月21日 閲覧 。 Pohlers, Volker (2017-04-24) [2012-02-20, 2009, 2002, 1988-07-26, 1987-10-11]. 「PRL2COM」 .ホームコンピュータのDDR (ドイツ語). 2020年2月21日時点のオリジナルよりアーカイブ。 2020年2月21日 閲覧 。