Submit Search
Upload
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
•
Download as PPTX, PDF
•
0 likes
•
154 views
G
gunya gunya
Follow
大学の課題で作ったけど時間が足りなかったためお蔵入りになったのでここに供養しておきます。あくまで「ハリボテ」です
Read less
Read more
Technology
Report
Share
Report
Share
1 of 23
Download now
Recommended
xv6 + mist32 + mruby
xv6 + mist32 + mruby
Hirotaka Kawata
Lisp_chibi_machine 190427
Lisp_chibi_machine 190427
たけおか しょうぞう
Mt basic as-os_on_danbot
Mt basic as-os_on_danbot
たけおか しょうぞう
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
Hirotaka Kawata
お化け
お化け
たけおか しょうぞう
Lispマシン ドキュメント和訳とか、 ちびLispとか
Lispマシン ドキュメント和訳とか、 ちびLispとか
たけおか しょうぞう
アルゴリズム+データ構造勉強会(10)
アルゴリズム+データ構造勉強会(10)
noldor
Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介
たけおか しょうぞう
Recommended
xv6 + mist32 + mruby
xv6 + mist32 + mruby
Hirotaka Kawata
Lisp_chibi_machine 190427
Lisp_chibi_machine 190427
たけおか しょうぞう
Mt basic as-os_on_danbot
Mt basic as-os_on_danbot
たけおか しょうぞう
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
Hirotaka Kawata
お化け
お化け
たけおか しょうぞう
Lispマシン ドキュメント和訳とか、 ちびLispとか
Lispマシン ドキュメント和訳とか、 ちびLispとか
たけおか しょうぞう
アルゴリズム+データ構造勉強会(10)
アルゴリズム+データ構造勉強会(10)
noldor
Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介
たけおか しょうぞう
ASICについて blockchain.tokyo
ASICについて blockchain.tokyo
Misato Takahashi
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
Atsushi Koshiba
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
PFI Seminar 2010/02/18
PFI Seminar 2010/02/18
Preferred Networks
Meltdown を正しく理解する
Meltdown を正しく理解する
Norimasa FUJITA
Inkernel disasm-from-intelsdm-kernelvm
Inkernel disasm-from-intelsdm-kernelvm
Masami Hiramatsu
Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache
maruyama097
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
VxRail ChampionClub
CPUの同時実行機能
CPUの同時実行機能
Shinichiro Niiyama
RISC-V User level ISA
RISC-V User level ISA
たけおか しょうぞう
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Kazuki Onishi
Ext4 filesystem(1)
Ext4 filesystem(1)
Yoshihiro Yunomae
Dataflow140711-a@Kernel/VM北陸1
Dataflow140711-a@Kernel/VM北陸1
たけおか しょうぞう
Dataflow140711@Kernel/VM北陸1
Dataflow140711@Kernel/VM北陸1
たけおか しょうぞう
2章 Linuxカーネル - メモリ管理1
2章 Linuxカーネル - メモリ管理1
mao999
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
d-kami x86-2
d-kami x86-2
Daisuke Kamikawa
半導体
半導体
Tetsuya Kimata
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
Insight Technology, Inc.
LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識
MKT International Inc.
デジタル・フォレンジックの最新動向(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...
博三 太田
More Related Content
Similar to ハリボテなx86エミュレータの作り方 - how to make x86 emulator
ASICについて blockchain.tokyo
ASICについて blockchain.tokyo
Misato Takahashi
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
Atsushi Koshiba
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
PFI Seminar 2010/02/18
PFI Seminar 2010/02/18
Preferred Networks
Meltdown を正しく理解する
Meltdown を正しく理解する
Norimasa FUJITA
Inkernel disasm-from-intelsdm-kernelvm
Inkernel disasm-from-intelsdm-kernelvm
Masami Hiramatsu
Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache
maruyama097
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
VxRail ChampionClub
CPUの同時実行機能
CPUの同時実行機能
Shinichiro Niiyama
RISC-V User level ISA
RISC-V User level ISA
たけおか しょうぞう
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Kazuki Onishi
Ext4 filesystem(1)
Ext4 filesystem(1)
Yoshihiro Yunomae
Dataflow140711-a@Kernel/VM北陸1
Dataflow140711-a@Kernel/VM北陸1
たけおか しょうぞう
Dataflow140711@Kernel/VM北陸1
Dataflow140711@Kernel/VM北陸1
たけおか しょうぞう
2章 Linuxカーネル - メモリ管理1
2章 Linuxカーネル - メモリ管理1
mao999
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
d-kami x86-2
d-kami x86-2
Daisuke Kamikawa
半導体
半導体
Tetsuya Kimata
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
Insight Technology, Inc.
LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識
MKT International Inc.
Similar to ハリボテなx86エミュレータの作り方 - how to make x86 emulator
(20)
ASICについて blockchain.tokyo
ASICについて blockchain.tokyo
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
PFI Seminar 2010/02/18
PFI Seminar 2010/02/18
Meltdown を正しく理解する
Meltdown を正しく理解する
Inkernel disasm-from-intelsdm-kernelvm
Inkernel disasm-from-intelsdm-kernelvm
Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
CPUの同時実行機能
CPUの同時実行機能
RISC-V User level ISA
RISC-V User level ISA
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Ext4 filesystem(1)
Ext4 filesystem(1)
Dataflow140711-a@Kernel/VM北陸1
Dataflow140711-a@Kernel/VM北陸1
Dataflow140711@Kernel/VM北陸1
Dataflow140711@Kernel/VM北陸1
2章 Linuxカーネル - メモリ管理1
2章 Linuxカーネル - メモリ管理1
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
d-kami x86-2
d-kami x86-2
半導体
半導体
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
[C31]世界最速カラムナーDBは本物だ! by Daisuke Hirama
LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識
Recently uploaded
デジタル・フォレンジックの最新動向(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...
博三 太田
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
Recently uploaded
(9)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~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)
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
1.
X86 エミュレータの作成
2.
x86とは 1978年に発売されたintel 8086とその後継に共通するアーキテクチャの総称
雑に言えばみなさんが今使っているパソコンで動いている32bitの命令アー キテクチャ 今回はCPUの動きを真似するようなプログラムの作成を目指す!
3.
x86のレジスタ レジスタ (値を格納する容器)
汎用レジスタ (8個) ・32bitのレジスタ。計算とかアドレス指定など様々な用途に使える。 セグメントレジスタ (6個) ・メモリアクセスに使用する。 EFLAGSレジスタ ・スタータスを格納。キャリーやオーバーフローなど。 EIPレジスタ ・命令がメモリのどこにあるのかを指す。
4.
x86のレジスタ • それぞれのレジスタは図のように名 前がつけられています。 • レジスタは主記憶装置よりも高速で あるが数に限りがあります。高水準 言語でプログラミングする際にはこ れらのことはコンパイラが全部良い 感じにしてくれる。 •
コンパイラすごい。 • セグメントレジスタの使用方法はメ モリモデルというもので決まります。
5.
命令を実行する仕組み ALU EIP 0xf4 memory 0xf4 Decoder とその他 加算 命令fetch
6.
命令のフォーマット Prefix 0-4 byte • ModR/Mはオペランドを柔軟に指定するための仕組みです。 後々解説します。 •
命令長は固定ではなく1byteから最長で15byteになります。 これは命令を複雑化することで高速化しているx86(cisc全体) の悪いところであると私は考えます。
7.
実装する(レジスタやメモリ) 32bit,16bitのレジスタはそれぞれ uint32_t,
uint16_tで表現できる。 メモリはuint8_tの配列。
8.
単純な命令の実装(hlt命令) この命令はCPUの実行を停止し、割り込みやreset信号で再開する命令。 オペコードは0xf4
割り込みは実装していないのでただ停止するように実装すれば良い。
9.
命令のフェッチとデコード
10.
mov(転送命令)を実装しよう! 殆どの場合オペランドが必要な命令はModR/Mというものでオペランドを指定する。 mov
REG32, R/M32 (レジスタ/メモリからレジスタへの転送)を実装してみる。 (オペコードは0x8b) mov ebx, [eax] は 8b 18 と機械語に翻訳される。つまり 18 の部分が ModR/M…?
11.
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] となる。
12.
参考・ModR/Mの表
13.
ModR/Mの実装
14.
MOV (0x89) の実装
Modrm にしたがってそれぞれの値を指定されたところに転送します。 コードを示したいところですが……ここまですると命令の実装はただの作業に なります。詳しく知りたい人はgithubで公開しているコードを参照してくださ い。 https://github.com/gunyagisa/x86emu 最後の方にビルド方法を書きました。 質問や改善点・ミスがあったらぜひ教えて下さい!!
15.
成果 VRAMを使用したGUI出力に対応(freeglutライブラリを使用) (ハリボテではあるが)リアルモードからプロテクトモードへの移行が出来 る!
メモリ保護などを実装(動きがあやしいけど大丈夫..?) 雑ではあるが単純なOSを動かせる..? いくつかのBios interruptionを実装 HDDからの読み込みやビデオモードの設定などbiosからの起動で必要とされる機能が 使用できる! 一応シリアル通信ができる(動作は不安定)
16.
電源投入から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を動かすにはココの動きを真似ればよい!
17.
BIOS(エミュレーション)の実装 bios.cc, bios.hで実装されています。
最低限必要なのはHDDからの読み込みとビデオモードの設定。 これらはbios interruption (割り込み処理)で呼ばれる機能で、int命令(0xcd) をエミュレーションするだけ。 ただしbios interruptionが使えるのはリアルモードだけなのでモードで条件分 岐すればよい
18.
IPLの実装 asm/ipl.asmにあるので興味が ある人は覗いてみてください! HDDからメモリへの転送したあ と2段目のプログラムへ制御を 渡します。
for文的なやつでひたすらHDDを 読み込んだ(readloopラベル) あと2段目が0x2c00番地に読み 込まれるはずなのでそこにjmp 命令でジャンプします
19.
2段目さん 実はiplは16bit用に書かれたプログラムでした。これはリアルモードが 16bitで動作するためです。 でも32bitあるんだから使いたいですよね?
ということで32bit(プロテクトモード)に移行するのがこのプログラム の主な役割です。 ホントは面倒な手順を踏まなければいけませんが今回は動作を真似する のが目的なので移行の手順はいくらか省いています。 (歴史的経緯?からキーボードコントローラからCPUの設定を行うなど意味 不明なところもあるので興味がある人はA20 Line enableなどで調べると楽 しくなれるかもです) 動作確認のために画面がカラフルになります
20.
OS OSと呼ぶにはお粗末過ぎますが画面を真っ白にし てくれます。 急にレイヤーが高くなりましたが、32bitで動作 するためここから先はC言語で開発できます!うれ しい!
ここに実際のカーネルを書くことで””ちゃんとし たOS””を動かすこともできます。もちろん数百あ るx86命令を実装しなければいけませんが…
21.
22.
まとめ 低レイヤはいいぞ
23.
参考. ビルド方法 ビルドシステムとして
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を実行できます。イメージファイルを渡すと それを実行してくれます。
Download now