現在の位置
backup プラグインを使用中
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 仕様/シミュレーション/エミュレーション へ行く。
- 1 (2009-09-01 (火) 21:06:55)
はじめに †
- エミュレーション
- 実際の演算やメモリ・アクセス,システムコールなどの再現
- ここでは,投機的/Out-of-orderにエミュレーションを実行するための仕組みについて説明
基本的なエミュレーションの仕組み †
エミュレータ †
- 主な役割
- PCに対応した命令情報の取得
- 演算の実行
- システム・コールの再現
- メモリ・イメージの管理保持
命令 †
- 命令を,動的な情報と静的な情報にわけて処理する
実行の流れ †
鬼斬では,シミュレータ側ドリブンでエミュレーションを実行する
- 命令の静的な情報の取得(デコード)
- Out-of-Order実行
- リタイア
- ストアの場合,ストア・バッファからエミュレータ側メモリ・イメージへの反映を行う
投機実行 †
- 通常の演算命令(レジスタのみにアクセス)
- レジスタについてはシミュレータ側でリネーミングや回復が行われるため,Out-of-Order に実行しても構わない
- メモリ・アクセスについては,シミュレータ側に実装されたストア・バッファによって投機が実現される
- エミュレータ側が持つメモリ・イメージには確定状態のみが反映される
- システム・コールは不特定かつ複数のメモリ・ロケーションを操作しうるため,シリアライズして実行
メモリ・アクセスの投機実行 †
- 実装としては,エミュレーションの実現コード内からシミュレーション側に制御を戻すことにより実現
- エミュレーション内からOpStateIF::Write/Read を呼ぶ
- ストアの場合,エミュレーション側のメモリ・イメージに直接反映を行うのではなく,一旦ストア・バッファにいれる
- ロードの場合,投機的に行われたストアの内容を考慮した値をシミュレータ側から戻す
- エミュレーション内からOpStateIF::Write/Read を呼ぶ
ロード †
- Op::Execute() ->
- (エミュレータ内のLoad実現コード) ->
- OpStateIF::Read() ->
- MemOrderManager ::Read() ->
- m_emulator->GetMemImage ()->Read()
ストア †
ストアの動作は命令の実行とリタイアに分けられる
- 実行時
- リタイア時
システム・コール命令の実行 †
- システム・コール呼び出し先の全ての動作を,システム・コール呼び出しの1命令によって行ったかのように扱う
- 依存元/先のメモリ・アドレスについてはわからないため,投機実行は行わずにシリアライズして実行する
- シリアライズ
- システム・コール命令を実行する場合,常にコア内にシステム・コール命令が1つしかない状態に保つ
- 上流の命令が全てリタイアするまで,システムコール命令をフェッチしない
- コア内にシステム・コール命令があった場合,命令をフェッチしない
- システム・コール命令を実行する場合,常にコア内にシステム・コール命令が1つしかない状態に保つ