Table of Contents |
はじめに †
- エミュレータ
- 実際の演算やメモリ・アクセス,システムコールなどの動作を実現する
- ここでは投機的/Out-of-orderにエミュレーションを実行するための仕組みについて説明
基本的なエミュレーションの仕組み †
- 鬼斬では,シミュレータ側ドリブンでエミュレーションを実行する
- シミュレータ側において,エミュレータより命令のOpコードやオペランド番号などの情報を取得し(デコード),
- それらの情報と,演算に使用する値等のコンテキストを合わせてエミュレータに与える事によって,演算結果を得る
エミュレータ †
- 主な役割
- PCに対応した命令情報の取得
- 演算の実行
- システム・コールの再現
- メモリ・イメージの管理保持
命令 †
- 命令を,動的な情報と静的な情報にわけて処理する
実行の流れ †
鬼斬では,シミュレータ側ドリブンでエミュレーションを実行する
- 命令の静的な情報の取得(デコード)
- Out-of-Order実行
- リタイア
- ストアの場合,ストア・バッファからエミュレータ側メモリ・イメージへの反映を行う
投機実行 †
- 通常の演算命令(レジスタのみにアクセス)
- レジスタについてはシミュレータ側でリネーミングや回復が行われるため,Out-of-Order に実行しても構わない
- メモリ・アクセスについては,シミュレータ側に実装されたストア・バッファによって投機が実現される
- エミュレータ側が持つメモリ・イメージには確定状態のみが反映される
- システム・コールは不特定かつ複数のメモリ・ロケーションを操作しうるため,シリアライズして実行
メモリ・アクセスの投機実行 †
- 実装としては,エミュレーションの実現コード内からシミュレーション側に制御を戻すことにより実現
- エミュレーション内からOpStateIF::Write/Read を呼ぶ
- ストアの場合,エミュレーション側のメモリ・イメージに直接反映を行うのではなく,一旦ストア・バッファにいれる
- ロードの場合,投機的に行われたストアの内容を考慮した値をシミュレータ側から戻す
- エミュレーション内からOpStateIF::Write/Read を呼ぶ
ロード †
- Op::Execute() ->
- (エミュレータ内のLoad実現コード) ->
- OpStateIF::Read() ->
- MemOrderManager ::Read() -> # 場合によっては,ここでストアバッファから値を取得
- m_emulator->GetMemImage ()->Read()
ストア †
ストアの動作は命令の実行とリタイアに分けられる
- 実行時
- Op::Execute() ->
- (エミュレータ内のStore実現コード) ->
- OpStateIF::Write() ->
- MemOrderManager ::Write() #シミュレータ側のストアバッファに格納
- リタイア時
システム・コール命令の実行 †
- システム・コール呼び出しの1命令によってシステム・コールによる動作を全て行ったかのように扱う
- 依存元/先のメモリ・アドレスについてはわからないため,投機実行は行わずにシリアライズして実行する
- シリアライズ
- システム・コール命令を実行する場合,常にコア内にシステム・コール命令が1つしかない状態に保つ
- 上流の命令が全てリタイアするまで,システムコール命令をフェッチしない
- コア内にシステム・コール命令があった場合,命令をフェッチしない
- システム・コール命令を実行する場合,常にコア内にシステム・コール命令が1つしかない状態に保つ
ツールボックス
メニュー
最新の20件
最新の20件
2022-12-31
2022-09-24
2022-01-26
2019-09-17
2019-07-11
2018-07-12
2018-05-09
2018-02-07
2017-10-27
2017-10-15
2017-05-01
2017-03-27
2015-12-24