SlideShare a Scribd company logo
2
Most read
6
Most read
8
Most read
X86 エミュレータの作成
x86とは
 1978年に発売されたintel 8086とその後継に共通するアーキテクチャの総称
 雑に言えばみなさんが今使っているパソコンで動いている32bitの命令アー
キテクチャ
 今回はCPUの動きを真似するようなプログラムの作成を目指す!
x86のレジスタ
 レジスタ (値を格納する容器)
 汎用レジスタ (8個)
・32bitのレジスタ。計算とかアドレス指定など様々な用途に使える。
 セグメントレジスタ (6個)
・メモリアクセスに使用する。
 EFLAGSレジスタ
・スタータスを格納。キャリーやオーバーフローなど。
 EIPレジスタ
・命令がメモリのどこにあるのかを指す。
x86のレジスタ
• それぞれのレジスタは図のように名
前がつけられています。
• レジスタは主記憶装置よりも高速で
あるが数に限りがあります。高水準
言語でプログラミングする際にはこ
れらのことはコンパイラが全部良い
感じにしてくれる。
• コンパイラすごい。
• セグメントレジスタの使用方法はメ
モリモデルというもので決まります。
命令を実行する仕組み
ALU
EIP 0xf4
memory
0xf4 Decoder
とその他
加算
命令fetch
命令のフォーマット
Prefix
0-4 byte
• ModR/Mはオペランドを柔軟に指定するための仕組みです。
後々解説します。
• 命令長は固定ではなく1byteから最長で15byteになります。
これは命令を複雑化することで高速化しているx86(cisc全体)
の悪いところであると私は考えます。
実装する(レジスタやメモリ)
 32bit,16bitのレジスタはそれぞれ uint32_t, uint16_tで表現できる。
 メモリはuint8_tの配列。
単純な命令の実装(hlt命令)
 この命令はCPUの実行を停止し、割り込みやreset信号で再開する命令。
 オペコードは0xf4
 割り込みは実装していないのでただ停止するように実装すれば良い。
命令のフェッチとデコード
mov(転送命令)を実装しよう!
 殆どの場合オペランドが必要な命令はModR/Mというものでオペランドを指定する。
 mov REG32, R/M32 (レジスタ/メモリからレジスタへの転送)を実装してみる。
(オペコードは0x8b)
 mov ebx, [eax] は 8b 18 と機械語に翻訳される。つまり 18 の部分が
ModR/M…?
ModR/Mの具体例
 0x18は2進数で 0001 1000
0 0 0 1 1 0 0 0
Mod Reg R/M
EAX 0 0 0
ECX 0 0 1
EDX 0 1 0
EBX 0 1 1
ESP 1 0 0
EBP 1 0 1
ESI 1 1 0
EDI 1 1 1
[ register ] 0 0
[register]+disp8 0 1
[register]+disp32 1 0
register 1 1
Mod の値
Register の値
Reg = ebx
R/M = [eax]
よって 8b 18 は mov ebx,
[eax] となる。
参考・ModR/Mの表
ModR/Mの実装
MOV (0x89) の実装
 Modrm にしたがってそれぞれの値を指定されたところに転送します。
 コードを示したいところですが……ここまですると命令の実装はただの作業に
なります。詳しく知りたい人はgithubで公開しているコードを参照してくださ
い。
 https://github.com/gunyagisa/x86emu
 最後の方にビルド方法を書きました。
 質問や改善点・ミスがあったらぜひ教えて下さい!!
成果
 VRAMを使用したGUI出力に対応(freeglutライブラリを使用)
 (ハリボテではあるが)リアルモードからプロテクトモードへの移行が出来
る!
 メモリ保護などを実装(動きがあやしいけど大丈夫..?)
 雑ではあるが単純なOSを動かせる..?
 いくつかのBios interruptionを実装
 HDDからの読み込みやビデオモードの設定などbiosからの起動で必要とされる機能が
使用できる!
 一応シリアル通信ができる(動作は不安定)
電源投入からOSまで
• POST (power on self test)
• ハードウェアの自己診断
• 電源投入すると自動でメモリや記憶装置、CPUをチェック!
• BIOS (basic input output system)
• postが終わるとbiosが呼ばれます。
• 画面表示やディスクの読み込みなど基本的なことを請け負ってくれるやつです。
• biosは最初にブートセクタの有無を確認します。(ディスクの先頭512byteのこと)
• ブートセクタがあれば起動可能と判断し、次にブートセクタを0x7c00に転送します。
• 最後に0x7c00に制御を移します。
• IPL (initial program loader)
• 実はブートセクタに書かれているプログラムがiplです。
• iplはOS本体を読み込み制御をOSに渡します。
• Biosから直接OSを呼べよ!!と思いますが512byteに収まらないためこのように多段式
になっています。実際のOSはもっと多段式になっている場合もあります。
POST
bios
IPL
start
OS
エミュレータの上でOSを動かすにはココの動きを真似ればよい!
BIOS(エミュレーション)の実装
 bios.cc, bios.hで実装されています。
 最低限必要なのはHDDからの読み込みとビデオモードの設定。
 これらはbios interruption (割り込み処理)で呼ばれる機能で、int命令(0xcd)
をエミュレーションするだけ。
 ただしbios interruptionが使えるのはリアルモードだけなのでモードで条件分
岐すればよい
IPLの実装
 asm/ipl.asmにあるので興味が
ある人は覗いてみてください!
 HDDからメモリへの転送したあ
と2段目のプログラムへ制御を
渡します。
 for文的なやつでひたすらHDDを
読み込んだ(readloopラベル)
あと2段目が0x2c00番地に読み
込まれるはずなのでそこにjmp
命令でジャンプします
2段目さん
 実はiplは16bit用に書かれたプログラムでした。これはリアルモードが
16bitで動作するためです。
 でも32bitあるんだから使いたいですよね?
 ということで32bit(プロテクトモード)に移行するのがこのプログラム
の主な役割です。
 ホントは面倒な手順を踏まなければいけませんが今回は動作を真似する
のが目的なので移行の手順はいくらか省いています。
(歴史的経緯?からキーボードコントローラからCPUの設定を行うなど意味
不明なところもあるので興味がある人はA20 Line enableなどで調べると楽
しくなれるかもです)
 動作確認のために画面がカラフルになります
OS
 OSと呼ぶにはお粗末過ぎますが画面を真っ白にし
てくれます。
 急にレイヤーが高くなりましたが、32bitで動作
するためここから先はC言語で開発できます!うれ
しい!
 ここに実際のカーネルを書くことで””ちゃんとし
たOS””を動かすこともできます。もちろん数百あ
るx86命令を実装しなければいけませんが…
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
まとめ
低レイヤはいいぞ
参考. ビルド方法
 ビルドシステムとして cmake と言うものを使っています。使っているOSのパッ
ケージ管理ソフト(aptとかyumとかpacman)でcmakeを入れる、またはソースから
ビルドしてください。
 Gui画面の表示にfreeglutライブラリを使用しています。同様にインストールしてお
いてください。
 mkdir build
 cd build
 cmake ..
 make
 上のコマンドでx86emuディレクトリ直下にx86emuという実行ファイルが生成されます。
 Test OSのビルドにはnasm (アセンブラ)、ld(リンカー、多分デフォルトで入っ
てる)、mtools(MS-DOSユーティリティ)が必要です。
 cd asm
 make test.img
 上のコマンドでビルドできます。
 ./x86emu asm/test.img でtest用のOSを実行できます。イメージファイルを渡すと
それを実行してくれます。

More Related Content

PDF
プロダクトマネージャのお仕事
PDF
Kanban 101「明日から使えるかもしれないカンバン」
PDF
機率統計 -- 使用 R 軟體
PDF
enterprise agile lean modeling
PDF
Dynamics 365 Customer Engagement 理解のススメ -サブスクリプションビジネスモデルから読み解くカスタマーサポート機能活用の...
PDF
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
PDF
JenkinsとCodeBuildとCloud Buildと私
PDF
amazon経営戦略の全体像
プロダクトマネージャのお仕事
Kanban 101「明日から使えるかもしれないカンバン」
機率統計 -- 使用 R 軟體
enterprise agile lean modeling
Dynamics 365 Customer Engagement 理解のススメ -サブスクリプションビジネスモデルから読み解くカスタマーサポート機能活用の...
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
JenkinsとCodeBuildとCloud Buildと私
amazon経営戦略の全体像

What's hot (20)

PPT
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
PDF
Webライティング11のルール
PDF
リッチなドメインモデル 名前探し
PDF
『機械学習による故障予測・異常検知 事例紹介とデータ分析プロジェクト推進ポイント』
PDF
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
PDF
相関と因果について考える:統計的因果推論、その(不)可能性の中心
PDF
データ基盤グループを支えるチームビルディング
PDF
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
PPTX
データ分析の目的に応じた人事、分析組織づくり、データ人材の評価
PDF
ぞくパタ最終回: 13章「共クラスタリング」
PPTX
データ分析基盤を支えるエンジニアリング
PPTX
CleanArchitecture 第4部 「コンポーネントの原則」
PDF
なぜデータモデリングが重要なのか?
PDF
RDRA流概念モデル
PDF
エスノグラフィック・デザインアプローチ
PPTX
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
PPTX
Rでのtry関数によるエラー処理
PDF
Agile Quality アジャイル品質パターン (QA2AQ)
PDF
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
PPTX
XAI (説明可能なAI) の必要性
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
Webライティング11のルール
リッチなドメインモデル 名前探し
『機械学習による故障予測・異常検知 事例紹介とデータ分析プロジェクト推進ポイント』
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
相関と因果について考える:統計的因果推論、その(不)可能性の中心
データ基盤グループを支えるチームビルディング
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
データ分析の目的に応じた人事、分析組織づくり、データ人材の評価
ぞくパタ最終回: 13章「共クラスタリング」
データ分析基盤を支えるエンジニアリング
CleanArchitecture 第4部 「コンポーネントの原則」
なぜデータモデリングが重要なのか?
RDRA流概念モデル
エスノグラフィック・デザインアプローチ
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Rでのtry関数によるエラー処理
Agile Quality アジャイル品質パターン (QA2AQ)
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
XAI (説明可能なAI) の必要性
Ad

Similar to ハリボテなx86エミュレータの作り方 - how to make x86 emulator (20)

PDF
Lisp_chibi_machine 190427
PPTX
ASICについて blockchain.tokyo
PDF
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
PDF
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
PDF
PFI Seminar 2010/02/18
PPTX
Meltdown を正しく理解する
PDF
Inkernel disasm-from-intelsdm-kernelvm
PDF
Java EE7 䛸㻌JCache 
PPTX
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
PDF
Lispマシン ドキュメント和訳とか、 ちびLispとか
PDF
CPUの同時実行機能
PDF
RISC-V User level ISA
PDF
プロセスとコンテキストスイッチ
PDF
Ext4 filesystem(1)
PDF
Dataflow140711@Kernel/VM北陸1
PDF
Dataflow140711-a@Kernel/VM北陸1
PDF
2章 Linuxカーネル - メモリ管理1
PPTX
C# 7.2 with .NET Core 2.1
PPT
d-kami x86-2
PDF
半導体
Lisp_chibi_machine 190427
ASICについて blockchain.tokyo
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
PFI Seminar 2010/02/18
Meltdown を正しく理解する
Inkernel disasm-from-intelsdm-kernelvm
Java EE7 䛸㻌JCache 
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
Lispマシン ドキュメント和訳とか、 ちびLispとか
CPUの同時実行機能
RISC-V User level ISA
プロセスとコンテキストスイッチ
Ext4 filesystem(1)
Dataflow140711@Kernel/VM北陸1
Dataflow140711-a@Kernel/VM北陸1
2章 Linuxカーネル - メモリ管理1
C# 7.2 with .NET Core 2.1
d-kami x86-2
半導体
Ad

ハリボテなx86エミュレータの作り方 - how to make x86 emulator