コンピュータサイエンスにおいて、自己変更コード( SMCまたはSMoC ) とは、実行中に自身の命令を変更するコードです。通常は、命令パスの長さを短縮してパフォーマンスを向上させるか、単純に類似した繰り返しコードを減らしてメンテナンスを簡素化します。この用語は通常、自己変更が意図的なコードにのみ適用され、バッファオーバーフローなどのエラーによってコードが誤って自身を変更する状況には適用されません。
自己修正コードでは、既存の命令を上書きしたり、実行時に新しいコードを生成してそのコードに制御を移したりすることがあります。
自己修正は、「フラグ設定」と条件付きプログラム分岐の方法の代替として使用でき、主に条件をテストする必要がある回数を減らすために使用されます。
この方法は、入出力サイクルごとに追加の計算オーバーヘッドを必要とせずに、条件付きでテスト/デバッグコードを呼び出すために頻繁に使用されます。
変更は次のように実行できます。
- 初期化中のみ– 入力パラメータに基づいて(このプロセスは一般的にソフトウェアの「構成」と呼ばれ、ハードウェアの観点ではプリント基板のジャンパーの設定に似ています)。プログラム エントリポインタの変更は、自己修正の間接的な方法と同等ですが、1 つ以上の代替命令パスの共存が必要になり、プログラム サイズが増加します。
- 実行中(「オンザフライ」) – 実行中に到達した特定のプログラム状態に基づく
どちらの場合でも、新しい命令を既存の命令の上にオーバーレイすることで、マシン コード命令自体に直接変更を加えることができます(たとえば、比較と分岐を無条件分岐または「NOP」に変更する)。
IBM System/360 アーキテクチャー、およびz/Architectureまでの後継では、EXECUTE (EX) 命令は、ターゲット命令の 2 番目のバイトをレジスター1の下位 8 ビットで論理的にオーバーレイします。これにより、ストレージ内の実際の命令は変更されませんが、自己変更の効果が得られます。
低レベル言語と高レベル言語でのアプリケーション
自己変更は、プログラミング言語とそのポインタのサポート、および/または動的コンパイラまたはインタープリタ「エンジン」へのアクセスに応じて、さまざまな方法で実行できます。
- 既存の命令(またはオペコード、レジスタ、フラグ、アドレスなどの命令の一部)のオーバーレイ、または
- メモリ内の命令全体または命令シーケンスを直接作成する
- ソースコードステートメントの作成または変更とそれに続く「ミニコンパイル」または動的解釈(evalステートメントを参照)
- プログラム全体を動的に作成し、それを実行する
アセンブリ言語
アセンブリ言語を使用すると、自己書き換えコードの実装は非常に簡単です。命令は、標準コンパイラがオブジェクトコードとして生成するシーケンスと同等のシーケンスで、メモリ内に動的に作成できます(または、保護されていないプログラムストレージ内の既存のコードにオーバーレイできます)[1] 。最新のプロセッサでは、 CPUキャッシュに意図しない副作用が生じる可能性があり、これを考慮する必要があります。この方法は、適切にコメントされたこのIBM/360アセンブラの例のように、「初回」の状態をテストするために頻繁に使用されていました。この方法では、命令オーバーレイを使用して、命令パスの長さを(N×1)−1短縮します。ここで、Nはファイル上のレコード数です(−1はオーバーレイを実行するための オーバーヘッドです)。
SUBRTN NOP はここで初めて開かれましたか?
* NOP は x'4700'<Address_of_opened> です。
OI SUBRTN+1,X'F0' はい、NOP を無条件分岐に変更します (47F0...)
初めてなので、入力を開いて入力ファイルを開きます。
開いて入力を取得通常の処理を再開します
...
代替コードでは、毎回「フラグ」をテストする必要があります。無条件分岐は比較命令よりもわずかに高速で、パス全体の長さも短縮されます。保護されたストレージに常駐するプログラムでは、後のオペレーティング システムではこの手法を使用できなかったため、代わりにサブルーチンへのポインタを変更することになりました。ポインタは動的ストレージに常駐し、最初のパスの後に OPEN をバイパスするために自由に変更できます (直接分岐してサブルーチンにリンクする代わりに最初にポインタをロードする必要があるため、パスの長さに N 命令が追加されますが、無条件分岐の N がそれに応じて短縮され、不要になります)。
以下は、 Zilog Z80アセンブリ言語の例です。コードは、レジスタ「B」を範囲 [0,5] で増分します。「CP」比較命令は、各ループで変更されます。
;==========
ORG 0H CALL FUNC00 HALT ;========== FUNC00: LD A 、6 LD HL 、label01 + 1 LD B 、( HL ) label00: INC B LD ( HL )、B label01: CP $ 0 JP NZ 、label00 RET ;===========
自己変更コードは、マシンの命令セットの制限を克服するために使用されることがあります。たとえば、Intel 8080命令セットでは、レジスタで指定された入力ポートからバイトを入力することはできません。入力ポートは、2 バイト命令の 2 番目のバイトとして、命令自体に静的にエンコードされます。自己変更コードを使用すると、レジスタの内容を命令の 2 番目のバイトに格納し、変更された命令を実行して目的の効果を得ることができます。
高級言語
一部のコンパイル言語では、自己変更コードを明示的に許可しています。たとえば、COBOLの ALTER 動詞は、実行中に変更される分岐命令として実装できます。[2]一部のバッチプログラミング手法では、自己変更コードが使用されます。ClipperとSPITBOLも、明示的な自己変更機能を提供します。B6700システムのAlgolコンパイラは、オペレーティング システムへのインターフェイスを提供し、実行コードはテキスト文字列または名前付きディスク ファイルを Algol コンパイラに渡し、新しいバージョンのプロシージャを呼び出すことができました。
インタプリタ型言語では、「マシン コード」はソース テキストであり、オンザフライで編集される可能性があります。SNOBOL では、実行されるソース ステートメントはテキスト配列の要素です。PerlやPythonなどの他の言語では、プログラムが実行時に新しいコードを作成し、eval関数を使用してそれを実行できますが、既存のコードを変更することはできません。変更されているように見せるには (マシン コードが実際に上書きされることはありません)、次の JavaScript の例のように、関数ポインタを変更します。
var f = function ( x ) { return x + 1 };
// f に新しい定義を割り当てます:
f = new Function ( 'x' , 'return x + 2' );
Lisp マクロを使用すると、プログラム コードを含む文字列を解析せずに実行時コードを生成することもできます。
Pushプログラミング言語は、自己修正プログラムを作成するために明示的に設計された遺伝的プログラミングシステムです。高水準言語ではありませんが、アセンブリ言語ほど低水準ではありません。[3]
複合修飾
複数のウィンドウが登場する前は、コマンドライン システムは実行中のコマンド スクリプトを変更するメニュー システムを提供していました。DOS スクリプト (または「バッチ」) ファイル MENU.BAT に次の内容が含まれているとします。 [ 4] [nb 1]
:始める ショーメニュー.EXE
コマンドラインからMENU.BATを起動すると、SHOWMENUは画面上のメニューを表示し、ヘルプ情報や使用例などを表示します。最終的に、ユーザーはSOMENAMEコマンドの実行を必要とする選択を行います。SHOWMENUは、MENU.BATファイルを書き換えて終了します。
:始める ショーメニュー.EXE誰かの名前 を呼ぶ.BAT GOTOスタート
DOS コマンド インタープリタはスクリプト ファイルをコンパイルしてから実行することも、実行を開始する前にファイル全体をメモリに読み込むことも、レコード バッファの内容に依存することもないため、SHOWMENU が終了すると、コマンド インタープリタは実行する新しいコマンド (ディレクトリ内のスクリプト ファイルSOMENAME をSHOWMENU が認識しているプロトコルを使用して呼び出すコマンド) を見つけ、そのコマンドが完了するとスクリプト ファイルの先頭に戻り、次の選択に備えて SHOWMENU を再度アクティブにします。メニューの選択が終了である場合、ファイルは元の状態に書き換えられます。この開始状態ではラベルは役に立ちませんが、ラベルまたは同等の量のテキストが必要です。これは、DOS コマンド インタープリタが次のコマンドを開始するときに次のコマンドのバイト位置を思い出すためです。したがって、書き換えられたファイルは、次のコマンドの開始点が実際に次のコマンドの開始となるようにアラインメントを維持する必要があります。
メニューシステム(および補助機能)の利便性とは別に、この方式では、選択されたコマンドがアクティブ化されたときにSHOWMENU.EXEシステムがメモリ内に存在しないことを意味し、メモリが限られている場合に大きな利点となります。[4] [5]
制御テーブル
制御テーブル インタープリタは、ある意味では、テーブル エントリから抽出されたデータ値によって「自己変更」されるものと考えることができます ( 「IF inputx = 'yyy'」という形式の条件文で具体的に手動でコーディングされるのではなく)。
チャンネルプログラム
一部の IBMアクセス方式では、従来、自己修正チャネル プログラムが使用されていました。この方法では、ディスク アドレスなどの値がチャネル プログラムによって参照される領域に読み込まれ、その後のチャネル コマンドによってディスクにアクセスするために使用されます。
歴史
1948年1月に実証されたIBM SSECには、命令を変更したり、命令をデータとまったく同じように扱ったりする機能があった。しかし、この機能は実際にはめったに使用されなかった。[6]コンピュータの初期の頃は、限られたメモリの使用を減らすため、またはパフォーマンスを向上させるため、あるいはその両方を行うために、自己修正コードがよく使用されていた。また、命令セットが制御フローを変更するために単純な分岐やスキップ命令しか提供していない場合に、サブルーチン呼び出しと戻りを実装するために使用されることもあった。[7] [8]この用途は、少なくとも理論的には、特定の超RISCアーキテクチャではまだ関連している。たとえば、 1命令セットコンピュータを参照。ドナルド・クヌースのMIXアーキテクチャも、サブルーチン呼び出しを実装するために自己修正コードを使用していた。[9]
使用法
自己変更コードはさまざまな目的に使用できます。
- 状態依存ループの半自動最適化。
- 負荷環境に応じて速度を最適化する動的なインプレースコード最適化。[10] [11] [nb 2]
- 実行時コード生成、または実行時またはロード時のアルゴリズムの特殊化 (これは、たとえば、リアルタイム グラフィックスの分野で人気があります)。たとえば、一般的なソート ユーティリティでは、特定の呼び出しで記述されたキー比較を実行するためのコードを準備します。
- オブジェクトのインライン状態を変更したり、クロージャの高レベルな構築をシミュレートしたりします。
- サブルーチン(ポインタ) アドレス呼び出しのパッチ適用。通常は、動的ライブラリのロード/初期化時に実行されますが、それ以外の場合は各呼び出し時に、サブルーチンのパラメータへの内部参照をパッチして、実際のアドレスを使用するようにします (つまり、間接的な自己変更)。
- 神経進化、遺伝的プログラミング、その他の進化アルゴリズムなどの進化型コンピューティング システム。
- リバースエンジニアリング(逆アセンブラやデバッガの使用による)を防止するため、またはウイルス/スパイウェアスキャンソフトウェアなどによる検出を回避するためにコードを非表示にします。
- (一部のアーキテクチャでは)オペコードの繰り返しパターンでメモリの100%を埋め、すべてのプログラムとデータを消去したり、ハードウェアをバーンインしたり、RAMテストを実行したりします。[12]
- メモリやディスク容量が限られている場合など、実行時に解凍して実行されるようにコードを圧縮する。 [10] [11]
- 非常に制限された命令セットの中には、特定の機能を実行するために自己変更コードを使用する以外に選択肢がないものもあります。たとえば、減算して負の場合に分岐する「命令」のみを使用する1 命令セット コンピュータ(OISC) マシンでは、自己変更コードを使用せずに間接コピー ( C 言語の「*a = **b」に相当するもの) を実行することはできません。
- ブート。初期のマイクロコンピュータでは、ブートローダに自己修正コードが使用されることが多かった。ブートローダは電源投入のたびにフロントパネルから入力されるため、ブートローダが自己修正しても問題にはならなかった。しかし、今日でも多くのブートストラップローダは自己再配置型であり、自己修正型のものもいくつかある。[nb 3]
- フォールトトレランスのための命令の変更。[13]
状態依存ループの最適化
疑似コードの例:
N回繰り返す{
STATEが1の場合
Aを1つ増やす
それ以外
Aを1つ減らす
Aを使って何かをする
}
この場合、自己変更コードは、ループを次のように書き直すだけです。
N回繰り返す{
Aを1つ増やす
Aを使って何かをする
STATEが切り替える必要がある場合{
上記の「増加」オペコードを「減少」オペコードに置き換えるか、その逆を行います。
}
}
オペコードの 2 状態置換は、「xor var at address with the value "opcodeOf(Inc) xor opcodeOf(dec)"」と簡単に記述できることに注意してください。
このソリューションの選択は、 Nの値と状態変化の頻度に応じて異なります。
専門分野
平均、極値、極値の位置、標準偏差などの統計値のセットを、大規模なデータ セットに対して計算するとします。一般的な状況では、データに重みを関連付けるオプションがあり、各 x i がaw iに関連付けられ、すべてのインデックス値で重みの存在をテストするのではなく、最初に 1 つのテストを行い、重みを使用するものと使用しないものの 2 つの計算バージョンを用意できます。ここで、各値に、その値をスキップするかどうかを示すブール値が関連付けられている可能性があるという、さらなるオプションを検討します。これは、順列とコード膨張の結果ごとに 1 つずつ、合計 4 つのコード バッチを生成することで処理できます。または、重みとスキップ配列を一時配列にマージすることもできます (スキップする値の重みは 0 です)。ただし、処理コストがかかり、それでも膨張します。ただし、コードを変更することで、統計を計算するテンプレートに、不要な値をスキップするためのコードと重みを適用するためのコードを適宜追加できます。オプションを繰り返しテストする必要はなく、データ配列は 1 回アクセスされます。また、重み配列とスキップ配列 (関係する場合) も 1 回アクセスされます。
カモフラージュとして使う
自己書き換えコードは標準コードよりも解析が複雑であるため、リバースエンジニアリングやソフトウェアクラッキングに対する保護として使用できます。自己書き換えコードは、1980 年代のIBM PC 互換機やApple IIなどのシステム用のディスクベース プログラムでコピー保護命令を隠すために使用されました。たとえば、IBM PC では、フロッピー ディスクドライブ アクセス命令はint 0x13実行可能プログラムのイメージには表示されませんが、プログラムの実行開始後に実行可能ファイルのメモリ イメージに書き込まれます。
自己書き換えコードは、コンピュータ ウイルスや一部のシェルコードなど、存在を明らかにしたくないプログラムによって使用されることもあります。自己書き換えコードを使用するウイルスやシェルコードは、ほとんどの場合、ポリモーフィック コードと組み合わせてこれを行います。実行中のコードの一部を変更することは、バッファ オーバーフローなどの特定の攻撃でも使用されます。
自己参照型機械学習システム
従来の機械学習システムには、パラメータを調整するための固定された事前プログラムされた学習アルゴリズムがあります。しかし、1980年代以降、ユルゲン・シュミットフーバーは、学習アルゴリズムを変更できる自己修正システムをいくつか発表しました。これらのシステムは、ユーザーが指定した適応度、エラー、報酬関数に従って有用な場合にのみ自己修正が存続するようにすることで、壊滅的な自己書き換えの危険を回避しています。[14]
オペレーティングシステム
Linuxカーネルは自己書き換えコードを広く利用していることが特筆すべき点である。これは、主要なアーキテクチャ(IA-32、x86-64、32ビットARM、ARM64など)ごとに単一のバイナリイメージを配布できるようにしながら、ブート中にメモリ内のカーネルコードを特定のCPUモデルに応じて適応させ、新しいCPU命令を利用したり、ハードウェアバグを回避したりできるようにするためである。[15] [16]程度は低いが、DR-DOSカーネルも、基盤となるプロセッサの世代に応じて、ロード時に速度が重要なセクションを最適化している。[10] [11] [注2]
いずれにしても、メタレベルでは、プログラムは他の場所に保存されているデータを変更したり (メタプログラミングを参照)、ポリモーフィズムを使用したりすることで、自身の動作を変更することができます。
マサリンの合成カーネル
Alexia Massalinの博士論文[17] [18]で発表されたSynthesisカーネルは、自己修正コードに対して構造化、あるいはオブジェクト指向のアプローチを採用した小さなUnixカーネルであり、コードがファイルハンドルなどの個々の対象に対して作成される。特定のタスクのコードを生成することで、Synthesisカーネルは(JITインタープリターと同様に)定数の畳み込みや共通部分式の削除などのさまざまな最適化を適用できる。
Synthesis カーネルは非常に高速でしたが、完全にアセンブリ言語で記述されていました。その結果、移植性が欠如したため、Massalin の最適化のアイデアは、製品版カーネルには採用されませんでした。ただし、この手法の構造から、既存の中級言語よりも複雑ではあるものの、高水準言語で実現できる可能性が示唆されています。このような言語とコンパイラにより、より高速なオペレーティング システムとアプリケーションの開発が可能になります。
ポール・ヘーベルリとブルース・カーシュは、開発コストの削減を優先し、自己修正コードの「軽視」や一般的な最適化に反対している。[19]
キャッシュと自己修正コードの相互作用
データ キャッシュと命令キャッシュが結合されていないアーキテクチャ (一部のSPARC、ARM、MIPSコアなど) では、変更コードによってキャッシュ同期を明示的に実行する必要があります (データ キャッシュをフラッシュし、変更されたメモリ領域の命令キャッシュを無効化します)。
場合によっては、自己変更コードの短いセクションは、最新のプロセッサでは実行速度が遅くなります。これは、最新のプロセッサが通常、コード ブロックをキャッシュ メモリに保持しようとするためです。プログラムが一部を書き換えるたびに、書き換えられた部分を再度キャッシュに読み込む必要があります。そのため、変更されたコードレットが変更コードと同じキャッシュ ラインを共有する場合、つまり変更されたメモリ アドレスが変更コードのアドレスから数バイト以内にある場合、わずかな遅延が発生します。
現代のプロセッサにおけるキャッシュ無効化の問題は、通常、内部ループ内での状態切り替えの場合など、変更がまれにしか発生しない場合にのみ、自己変更コードの方が高速になることを意味します。[引用が必要]
最近のプロセッサのほとんどは、マシン コードを実行する前にロードします。つまり、命令ポインタに近すぎる命令が変更されても、プロセッサはそれに気付かず、変更前のコードを実行します。プリフェッチ入力キュー(PIQ) を参照してください。PC プロセッサは、下位互換性のために自己変更コードを正しく処理する必要がありますが、その処理は効率的とは言えません。[引用が必要]
セキュリティ問題
自己修正コードにはセキュリティ上の問題があることから、主要なオペレーティング システムはすべて、そのような脆弱性が判明するとすぐにそれを慎重に除去します。懸念されるのは、プログラムが意図的に自己修正することではなく、エクスプロイトによって悪意を持って変更される可能性があることです。
悪意のあるコード変更を防ぐためのメカニズムの 1 つに、 W^X (write xor execute)と呼ばれるオペレーティング システム機能があります。このメカニズムは、プログラムがメモリのどのページも書き込み可能かつ実行可能にすることを禁止します。一部のシステムでは、書き込み権限が削除されても、書き込み可能なページが実行可能に変更されることを防止します。 [要出典]他のシステムでは、一種の「バック ドア」が提供され、メモリのページの複数のマッピングに異なる権限を持たせることができます。W^X を回避する比較的移植性の高い方法は、すべての権限を持つファイルを作成し、そのファイルをメモリに 2 回マッピングすることです。Linux では、文書化されていない SysV 共有メモリ フラグを使用して、ファイルを作成しなくても実行可能な共有メモリを取得できます。[要出典]
利点
- プログラムの実行に高速パスを確立できるため、繰り返しになる条件分岐が削減されます。
- 自己修正コードはアルゴリズムの効率を向上させることができます。
デメリット
自己変更コードは、ソース プログラム リスト内の命令が必ずしも実行される命令ではないため、読みにくく、保守しにくくなります。呼び出される関数の名前が、後で識別される関数のプレースホルダーであることが明らかであれば、関数ポインターの置換で構成される自己変更はそれほどわかりにくくない可能性があります。
自己変更コードは、フラグをテストし、テストの結果に基づいて代替シーケンスに分岐する コードとして書き直すことができますが、自己変更コードは通常、より高速に実行されます。
自己変更コードはコードの認証と競合し、システム上で実行されるすべてのコードに署名することを要求するポリシーの例外が必要になる場合があります。
変更されたコードは元の形式とは別に保存する必要があり、通常は RAM 内のコードを破棄し、必要に応じて実行可能ファイルから再ロードするメモリ管理ソリューションと競合します。
命令パイプラインを備えた最新のプロセッサでは、頻繁に自身を変更するコードが、プロセッサが既にメモリからパイプラインに読み込んだ命令を変更する場合、実行速度が遅くなる可能性があります。一部のこのようなプロセッサでは、変更された命令が正しく実行されるようにする唯一の方法は、パイプラインをフラッシュして多くの命令を再度読み込むことです。
次のような一部の環境では、自己変更コードをまったく使用できません。
- 厳格な W^X セキュリティを備えたオペレーティング システムで実行されるアプリケーション ソフトウェアは、書き込みが許可されているページ内の命令を実行することはできません。メモリに命令を書き込み、後でそれらの命令を実行できるのはオペレーティング システムだけです。
- 多くのハーバード アーキテクチャ マイクロコントローラは、読み書き可能なメモリ内の命令を実行できず、書き込みができないメモリ、ROM、または非自己プログラム可能なフラッシュ メモリ内の命令のみを実行できます。
- マルチスレッド アプリケーションでは、複数のスレッドが同じ自己変更コードのセクションを実行することがあり、その結果、計算エラーやアプリケーション障害が発生する可能性があります。
参照
- 重複コード
- 多態的コード
- 多形性エンジン
- 永続的なデータ構造
- AARDコード
- アルゴリズムの効率
- コードとしてのデータ
- 評価文
- IBM 1130 (例)
- ジャストインタイム コンパイル: この手法では、多くの場合、自己修正コードの多くの利点 (メモリ サイズを除く) を欠点なしにユーザーに提供できます。
- 動的なデッドコードの除去
- 同図像性
- PCASTL
- クワイン(コンピューティング)
- 自己複製
- リフレクティブプログラミング
- モンキーパッチ: プログラムの元のソースコードに影響を与えないランタイムコードの変更
- 拡張可能なプログラミング: プログラミング言語が独自の構文を変更できるプログラミングパラダイム
- 自己改変型コンピュータウイルス
- セルフホスティング
- 合成プログラミング
- コンパイラのブートストラップ
- パッチ可能なマイクロコード
注記
- ^ DOS のそれ以降のバージョン (バージョン 6.0 以降) では、外部CHOICEコマンド ( DR-DOSでは内部コマンドとCONFIG.SYSディレクティブSWITCHも) が導入されたため、この特定のメニュー システムのアプリケーション例では、自己修正バッチジョブを参照する必要はなくなりましたが、他のアプリケーションでは引き続き実行可能なソリューションでした。
- ^ ab たとえば、386以上のプロセッサで実行する場合、Novell DOS 7以降のアップデートやDR-DOS 7.02以降では、ディスク データ転送を高速化するために、あるメモリ位置から別のメモリ位置へデータをコピーするときに
REP MOVSW、カーネルのランタイム イメージ内の 16 ビット (「コピー ワード」) 命令のデフォルト シーケンスの一部を 32 ビットREP MOVSD(「コピー ダブル ワード」) 命令に動的に置き換えます (必要な繰り返し回数の半分)。奇数カウントなどのエッジ ケースは処理されます。 [10] [11] - ^ たとえば、DR-DOS MBRとブート セクタ(パーティション テーブルとBIOS パラメータ ブロックも保持し、コード用にそれぞれ 446 バイト未満と 423 バイト未満を残す) は、従来、FAT12またはFAT16ファイル システムでブート ファイルを自動的に見つけ、それをまとめてメモリにロードできました。これに対し、MS-DOS / PC DOSでは、システム ファイルがファイル システムの最初の 2 つのディレクトリ エントリを占め、IBMBIO.COMの最初の 3 つのセクタが、ファイルの残りの部分をメモリにロードするためのセカンダリ ローダーを含む連続セクタのデータ領域の先頭に格納されていました ( SYS がこれらすべての条件を処理する必要があった)。FAT32とLBA のサポートが追加されたとき、Microsoft はサイズ上の理由から386命令を必要とし、ブート コードを 2 つのセクターに分割するように切り替えましたが、これは DR-DOS のオプションではありませんでした。これは、マルチブートおよびチェーン ロードシナリオで他のオペレーティング システムとの下位互換性と相互互換性が失われるだけでなく、古いPCとも互換性が失われるためです。代わりに、DR-DOS 7.07 のブート セクターは、自己変更コード、マシン語でのオペコードレベルのプログラミング、(文書化された)副作用の制御された利用、マルチレベルのデータ/コードオーバーラップ、およびアルゴリズムによる折りたたみ手法に頼って、拡張機能を一切犠牲にすることなく、すべてをわずか 512 バイトの物理セクターに収めました。
参考文献
- ^ 「HP 9100A/B」。MoHPC - HP 電卓博物館。1998 年。重複データとプログラムメモリ / 自己修正コード。2023 年 9 月 23 日時点のオリジナルよりアーカイブ。2023年 9 月 23 日閲覧。
- ^ 「ALTER ステートメント」。COBOL 言語リファレンス。Micro Focus。
- ^ Spector, Lee. 「Push による進化的コンピューティング: Push、PushGP、Pushpop」 。2023年 4 月 25 日閲覧。
- ^ ab Fosdal, Lars (2001). 「自己修正バッチファイル」。2008-04-21時点のオリジナルよりアーカイブ。
- ^ ポール、マティアス R. (1996-10-13) [1996-08-21、1994]。PC-Netzen および Deren Realisierung für eine konkrete Novell-LAN-Umgebung unter Benutzung der Batchsprache von DOS の管理者アウフガベンを構築します。 3.11(ドイツ語)。アーヘン、ドイツ: Lehrstuhl für Kommunikationsnetze ( ComNets ) およびInstitut für Kunststoffverarbeitung (IKV)、RWTH。 51、71–72ページ。(110+3 ページ、ディスケット) (注:クライアントに常駐する管理ソフトウェアを必要とせず、メモリ フットプリントがゼロの自己複製および間接的に自己修正するバッチジョブに基づく、 LAN環境での自己修復更新メカニズムによる自動クライアント構成およびソフトウェア展開のための、集中制御のモジュール式分散管理システムの設計と実装。)
- ^ Bashe, Charles J.; Buchholz, Werner ; Hawkins, George V.; Ingram, J. James; Rochester, Nathaniel (1981 年 9 月). 「IBM の初期コンピューターのアーキテクチャー」(PDF) . IBM Journal of Research and Development . 25 (5): 363–376. CiteSeerX 10.1.1.93.8952 . doi :10.1147/rd.255.0363. ISSN 0018-8646 . 2023 年 4 月 25 日閲覧。p. 365:
SSEC は、格納されている命令をデータとまったく同じように扱い、変更して、その結果に基づいて動作することができる最初のオペレーティング コンピューターでした。
- ^ Miller, Barton P. (2006-10-30). 「バイナリコードパッチング:21世紀向けに改良された古代の技術」。トライアングルコンピュータサイエンス著名講師シリーズ - セミナー 2006–2007。NC州立大学、コンピュータサイエンス学部。 2023年4月25日閲覧。
- ^ Wenzl, Matthias; Merzdovnik, Georg; Ullrich, Johanna; Weippl, Edgar R. (2019年6月) [2019年2月、2018年11月、2018年5月]。「ハックから精巧な手法へ - バイナリ書き換えに関する調査」(PDF)。ACM Computing Surveys。52 (3)。ウィーン、オーストリア: 49:1–49:36 [49:1]。doi : 10.1145 /3316415。S2CID 195357367。 記事49。2021年1月15日にオリジナルからアーカイブ(PDF) 。 2021年11月28日閲覧。p. 49:1:
[…] もともと、
バイナリ書き換えは、
実行中にプログラムの一部を変更する必要性から始まりました (例:
1960 年代の
PDP-1での実行時パッチ適用) […]
(36ページ)
- ^ Knuth, Donald Ervin (2009) [1997]. 「MMIX 2009 - 第三千年紀のRISCコンピュータ」。2021年11月27日時点のオリジナルよりアーカイブ。2021年11月28日閲覧。
- ^ abcd "Caldera OpenDOS Machine Readable Source Kit (MRS) 7.01". Caldera, Inc. 1997-05-01. 2021-08-07時点のオリジナルよりアーカイブ。 2022-01-02に取得。[1]
- ^ abcd Paul, Matthias R. (1997-10-02). 「Caldera OpenDOS 7.01/7.02 Update Alpha 3 IBMBIO.COM README.TXT」。2003-10-04 時点のオリジナルよりアーカイブ。2009-03-29閲覧。[2]
- ^ Wilkinson, William "Bill" Albert (2003) [1996, 1984]. 「H89ワーム:H89のメモリテスト」。Bill WilkinsonのHeath Companyページ。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 のアドレスが表示される可能性があります。これにより、問題が 8 つの IC に絞り込まれ、32 個もの IC をチェックする必要がなくなりました。[…] この[…] プログラムは、メモリの下位から最後の作業アドレスまで RST 7 (RESTART 7) 命令をプッシュしてワーム テストを実行します。プログラムの残りの部分は静止したままで、RST 7 コマンドの現在の位置の表示とその
再配置
を処理します。ちなみに、このプログラムは、RST 7 命令がメモリを上方向に移動すると、
NOP
(NO OPERATION)の
痕跡
が残るため、
ワーム
テストと呼ばれています。[…]
- ^ Ortiz, Carlos Enrique (2015-08-29) [2007-08-18]. 「自己修正コードとスペースシャトルOSについて」2023-04-25閲覧。
- ^ Jürgen Schmidhuberの自己参照型機械学習システムのための自己修正コードに関する出版物
- ^ Paltsev, Evgeniy (2020-01-30). 「Linux カーネルの自己修正コード - 何、どこ、どのように」。2022-11-27閲覧。
- ^ Wieczorkiewicz, Pawel. 「Linux カーネルの代替案」。2022年 11 月 27 日閲覧。
- ^ Pu, Calton ; Massalin, Henry ; Ioannidis, John (1992). Synthesis: 基本的なオペレーティングシステムサービスの効率的な実装(PDF) (博士論文). ニューヨーク、米国:コロンビア大学コンピューターサイエンス学部。UMI 注文番号 GAX92-32050。2023年 4 月 25 日閲覧。[3]
- ^ Henson, Valerie (2008-02-20). 「KHB: Synthesis: 基本的なオペレーティングシステムサービスの効率的な実装」. LWN.net . 2021-08-17 にオリジナルからアーカイブ。2022-05-19に取得。
- ^ ポール・ハエベリ;カーシュ、ブルース (1994-02-03)。 「イオ ノイ ボッチョーニ - 未来派プログラミングの背景」。グラフィカ・オブスクラ。2023 年 4 月 25 日に取得。
さらに読む
- Åkesson, Linus (2013-03-31). 「GCR オンザフライ デコーディング」。2017-03-21 にオリジナルからアーカイブ。2017-03-21に取得。
- ビュルケルト、クリスチャン・フェリックス (2012-03-20)。Eine Bibliothek für Selbstmodifikationen zur Laufzeit in Java [ A library for self-modification at runtime in Java ] (PDF) (論文) (ドイツ語)。ザールランデス大学、Naturwissenschaftlich-Technische Fakultät I、Fachrichtung Informatik。2023-08-18 にオリジナルからアーカイブ(PDF)されました。2023-08-18に取得。(80ページ)
外部リンク
- Linux での自己修正コードの使用
- 自己修正Cコード
- 認定された自己修正コード
