SlideShare a Scribd company logo
1 of 23
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命令を実装しなければいけませんが…
まとめ
低レイヤはいいぞ
参考. ビルド方法
 ビルドシステムとして 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

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

ASICについて blockchain.tokyo
ASICについて blockchain.tokyoASICについて blockchain.tokyo
ASICについて blockchain.tokyoMisato Takahashi
 
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent MemoryASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent MemoryAtsushi Koshiba
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010Tsukasa Oi
 
Meltdown を正しく理解する
Meltdown を正しく理解するMeltdown を正しく理解する
Meltdown を正しく理解するNorimasa FUJITA
 
Inkernel disasm-from-intelsdm-kernelvm
Inkernel disasm-from-intelsdm-kernelvmInkernel disasm-from-intelsdm-kernelvm
Inkernel disasm-from-intelsdm-kernelvmMasami Hiramatsu
 
Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache maruyama097
 
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキストVxRail ChampionClub
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチKazuki Onishi
 
2章 Linuxカーネル - メモリ管理1
2章 Linuxカーネル - メモリ管理12章 Linuxカーネル - メモリ管理1
2章 Linuxカーネル - メモリ管理1mao999
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
[C31]世界最速カラムナーDBは本物だ! by Daisuke HiramaInsight Technology, Inc.
 
LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識MKT International Inc.
 

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

ASICについて blockchain.tokyo
ASICについて blockchain.tokyoASICについて blockchain.tokyo
ASICについて blockchain.tokyo
 
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent MemoryASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
 
PFI Seminar 2010/02/18
PFI Seminar 2010/02/18PFI Seminar 2010/02/18
PFI Seminar 2010/02/18
 
Meltdown を正しく理解する
Meltdown を正しく理解するMeltdown を正しく理解する
Meltdown を正しく理解する
 
Inkernel disasm-from-intelsdm-kernelvm
Inkernel disasm-from-intelsdm-kernelvmInkernel disasm-from-intelsdm-kernelvm
Inkernel disasm-from-intelsdm-kernelvm
 
Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache 
 
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
 
CPUの同時実行機能
CPUの同時実行機能CPUの同時実行機能
CPUの同時実行機能
 
RISC-V User level ISA
RISC-V User level ISARISC-V User level ISA
RISC-V User level ISA
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
Ext4 filesystem(1)
Ext4 filesystem(1)Ext4 filesystem(1)
Ext4 filesystem(1)
 
Dataflow140711-a@Kernel/VM北陸1
Dataflow140711-a@Kernel/VM北陸1Dataflow140711-a@Kernel/VM北陸1
Dataflow140711-a@Kernel/VM北陸1
 
Dataflow140711@Kernel/VM北陸1
Dataflow140711@Kernel/VM北陸1Dataflow140711@Kernel/VM北陸1
Dataflow140711@Kernel/VM北陸1
 
2章 Linuxカーネル - メモリ管理1
2章 Linuxカーネル - メモリ管理12章 Linuxカーネル - メモリ管理1
2章 Linuxカーネル - メモリ管理1
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
d-kami x86-2
d-kami x86-2d-kami x86-2
d-kami x86-2
 
半導体
半導体半導体
半導体
 
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
 
LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 

Recently uploaded (9)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 

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