Web 2.0 Conference 2005 実行時自己書き換え佳境 首藤 一幸 話の流れのスライドを加える?

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

モバイルエージェントシステムの実装 エージェント移動(状態とコードの一括移送) エージェント移動の特徴 システム構成 エージェントプログラム
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
コンパイラ 2011年11月14日
全体ミーティング (4/25) 村田雅之.
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
2006年度 計算機システム演習 第4回 2005年5月19日.
コンパイラ 2011年11月24日
小型デバイスからのデータアクセス 情報処理系論 第5回.
アルゴリズムとデータ構造 2011年6月13日
プログラムはなぜ動くのか.
の まとめ 2007/04/02 (Mon) / d;id:hzkr
Ibaraki Univ. Dept of Electrical & Electronic Eng.
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
オペレーティングシステム i386アーキテクチャ(2)
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
CONCURRENT PROGRAMMING
RMI ソフトウェア特論 第6回 /
コンパイラ 2012年11月19日
Flyingware : バイトコード変換による 安全なエージェントの実行
コンパイラの解析 (2) GCJのデータ構造 - 1.
型付きアセンブリ言語を用いた安全なカーネル拡張
ソフトウェア工学 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
セキュリティ(3) 05A2013 大川内 斉.
マルチスレッド処理 マルチプロセス処理について
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
オペレーティングシステム イントロダクション
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
コンピュータの基本構成について 1E16M001-1 秋田梨紗 1E16M010-2 梅山桃香 1E16M013-3 大津智紗子
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
コンパイラ資料 実行時環境.
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
オペレーティングシステムJ/K 2004年11月15日2時限目
C言語を用いたマシン非依存な JITコンパイラ作成フレームワーク
オブジェクト指向プログラミングと開発環境
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
アルゴリズムとプログラミング (Algorithms and Programming)
コンピュータアーキテクチャ 第 4 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第一回 計算機の歴史、基本構成、動作原理
アルゴリズムとデータ構造 2012年6月11日
サブゼミ第7回 実装編① オブジェクト型とキャスト.
コンピュータアーキテクチャ 第 5 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第二回 命令の種類と形式
アルゴリズムとデータ構造1 2009年6月15日
コンピュータアーキテクチャ 第 4 回.
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
コンピュータアーキテクチャ 第 5 回.
第2回 開発環境とゲーム 05A1030 佐々木 和也.
SMP/マルチコアに対応した 型付きアセンブリ言語
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
アルゴリズムとデータ構造 2010年6月17日
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
情報システム基盤学基礎1 コンピュータアーキテクチャ編
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

Web 2.0 Conference 2005 実行時自己書き換え佳境 首藤 一幸 話の流れのスライドを加える?

Core Wars (1984) 復刊希望 機械語プログラムどうしを戦わせるゲーム。 月刊ASCIIでも2回(?) 特集記事に。 リング状のメモリ空間で相手を破壊し合う。 自分のコードを実行しているスレッドが なくなったら負け。 仮想マシンの命令は 10種類程度。 月刊ASCIIでも2回(?) 特集記事に。

Core Wars 動物図鑑 Imp(小鬼) Imp Pit(小鬼地獄) Dwarf(一寸法師) MOV 0 1 自身を次のアドレスにコピーする。永遠に。 Imp Pit(小鬼地獄) MOV #0 -1 JMP -1 1番地手前に即値 0 を書き込み続けて、小鬼を上書きする。 Dwarf(一寸法師) DAT -1 ADD #5 -1 MOV #0 @-2 JMP -2 5番地おきに即値 0 を爆撃する。永遠に。

マルチスレッドなプログラム Q. これって、リアル Core Wars ですか? A. いえいえ、 他のスレッドの実行を妨げてはいけません。 実行の流れ(スレッド)が複数あって、 メモリ空間を共有する。 スレッドごとにプログラムカウンタ(PC)があり、 それぞれプログラム中の別の場所を実行する。 同一プロセッサ上での並行処理かもしれないし、 SMPなど、複数プロセッサでの並列処理かもしれない。 Q. これって、リアル Core Wars ですか? A. いえいえ、 他のスレッドの実行を妨げてはいけません。 メモリ上の プログラム 書き換え中の個所を実行する スレッドがあるかもしれず。 スレッドA のPC 書き換え対象 コード 書き換え スレッドB のPC 書き換え側 コード 実は、自己書き換えでなくとも、 外部からの書き換えでも同じこと。

なんで自己書き換えなんかするの? 私が見た例 HotSpot VM (SunのJava仮想マシン) アプリのスレッドを任意の個所で停止させるために、ソフトウエア割り込み命令を上書きする。後で元のコードを書き戻す。 ガーベジコレクションやOn-stack replacement 目的。 IBM の Java仮想マシン (by IBM東京基礎研) メソッド探索せずに呼び出すことができていた(仮想)メソッドの呼び出しに探索が必要になった場合、JITコンパイル済みのコードを書き換える。 あらかじめ、直接呼び出すコードと探索を行うコードの両方を生成しておく。

なんで自己書き換えなんかするの? 私が書いた例 shuJIT (x86用 Java JITコンパイラ) 一度だけ実行すればよい処理を、 二度目以降はパスするため。 性能のため、条件分岐は避けたい。 参考:初回実行時のみの処理 クラスの初期化 Static変数アクセス、staticメソッド呼び出し、インスタンス生成 インスタンス生成時の諸チェック Interfaceやabstractクラスではないか? もしそうならIllegalAccessErrorをthrow Interface呼び出し時の呼び出し先解決結果チェック メソッドが見つからなければ IncompatibleClassChangeErrorをthrow

自己書き換えの例 shuJIT に実装した 手法 その1 生成しておく機械語命令列: nop nop 初回実行時のみの処理 「nop」を「jmp done」に書き換え done: …… 一度実行された後: jmp done 初回実行時のみの処理 「nop」を「jmp done」に書き換え done: …… 不要な処理を スキップ

自己書き換えの例 (余談) 書き換えのためには、その時点の プログラムカウンタ(PC)の値を 把握する必要がある。 x86 では PC は汎用レジスタのようには 読み出せない。どうする?

自己書き換えの例 (余談) プログラムカウンタの取得 E8 00 00 00 00 call 次のpopl命令 XX popl レジスタ

※本当は、シグナルハンドラ中でのシグナル発生を防ぐため、トランポリンを生成し、ハンドラからそこに戻る。 自己書き換えの例 shuJIT に実装した 手法 その2 ソフトウェア割り込みを使う方法 例えば x86 の INT 3命令 SIGTRAPを発生させる1バイト命令 (0xCC)。 デバッガ用なので、デバッガを使いにくくなるという問題も。 INT $0x10 といった2バイト命令でもよいが、1バイト命令なら書き換え時にatomicity(後述)を気にせずに済む。 シグナルハンドラ: void signal_handler(…) { ・※初回限定の処理を行う ・INT 3を本来のコードで上書き ・シグナルコンテクスト中の プログラムカウンタを設定 } コード生成時: 生成したコードを 「INT 3」で上書き しておく。 INT 3 ……… ※本当は、シグナルハンドラ中でのシグナル発生を防ぐため、トランポリンを生成し、ハンドラからそこに戻る。

○| ̄|_ ソフトウェア割り込みを使うことで コード生成量を減らすことができた。 しかしメモリ消費量は減らなかった。 例外表: コードの量: ジャンプ上書き 1516 KB ソフトウェア割り込み 1408 KB 例外表まで含めたメモリ消費量 ジャンプ上書き 1682 KB ソフトウェア割り込み 1773 KB 例外表: シグナル発生時に、Javaバイトコード上のプログラムカウンタを得るための表。 ソフトウェア割り込みを活用するために必要になった。 減った 増えた _| ̄|○

Core Wars ふたたび Core Wars マルチスレッドな普通のプログラム 妨害: メモリ書き換えで他者のスレッドを妨害する。 実行時書き換えの際に、 他のスレッドを妨害してはいけない。 妨害: 書き換え途中の新旧混ざったコードを実行してしまう。 命令パイプラインに書き換え前のコードが残っており、新旧混ぜて実行してしまう。 ……

他のスレッドを妨害しないために 一貫した状態のメモリを見る、見せるために。 Atomic に書き換える ロック 一時停止 罠 具体的には 1バイト単位のアクセス (486以降) 16/32ビット境界に整列された16/32ビット単位のアクセス (486以降) 64ビット境界に整列された 64ビット単位のアクセス (P5以降) 整列されていない、キャッシュライン (32バイト) に収まるアクセス (P6のみ) Atomicにメモリを書き換える方法が、プロセッサごとに用意されている。 x86 だと XCHG命令など。 ロック モニタ、セマフォ、… アプリ側に(コード書き換え用)ロックを取得させるというのは、性能上あり得ない。 一時停止 差し支えない位置で、他のスレッドを止める。やっかい。 罠

罠 Core Warsのテクニックがリアルに使える! Core Wars の Imp Pit(小鬼地獄)のように MOV #0 -1 JMP -1 1番地手前に即値0を書き込み続ける。 書き換え対象領域の先頭で、他のスレッドを足止めする 書き換え対象の先頭2バイトに、 トラップ EB FEを(atomicに)書き込む。 EB FE: 自身へのジャンプ命令 3バイト目以降を書き換える。 先頭2バイトを書き換える。 マルチスレッドプログラミングでは Core Warsのテクニックがリアルに使える! というのは言いすぎ。