Submit Search
ハリボテなx86エミュレータの作り方 - how to make x86 emulator
Download as PPTX, PDF
0 likes
220 views
G
gunya gunya
大学の課題で作ったけど時間が足りなかったためお蔵入りになったのでここに供養しておきます。あくまで「ハリボテ」です
Technology
Read more
1 of 23
Download now
Download to read offline
1
2
Most read
3
4
5
6
Most read
7
8
Most read
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
More Related Content
PDF
プロダクトマネージャのお仕事
Shohei Hido
PDF
Kanban 101「明日から使えるかもしれないカンバン」
Shuji Yamada
PDF
機率統計 -- 使用 R 軟體
鍾誠 陳鍾誠
PDF
enterprise agile lean modeling
Kenji Hiranabe
PDF
Dynamics 365 Customer Engagement 理解のススメ -サブスクリプションビジネスモデルから読み解くカスタマーサポート機能活用の...
Kazuya Sugimoto
PDF
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
de:code 2017
PDF
JenkinsとCodeBuildとCloud Buildと私
Shoji Shirotori
PDF
amazon経営戦略の全体像
Hiroto Ikeda
プロダクトマネージャのお仕事
Shohei Hido
Kanban 101「明日から使えるかもしれないカンバン」
Shuji Yamada
機率統計 -- 使用 R 軟體
鍾誠 陳鍾誠
enterprise agile lean modeling
Kenji Hiranabe
Dynamics 365 Customer Engagement 理解のススメ -サブスクリプションビジネスモデルから読み解くカスタマーサポート機能活用の...
Kazuya Sugimoto
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
de:code 2017
JenkinsとCodeBuildとCloud Buildと私
Shoji Shirotori
amazon経営戦略の全体像
Hiroto Ikeda
What's hot
(20)
PPT
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
Masashi Umezawa
PDF
Webライティング11のルール
Tsutomu Sogitani
PDF
リッチなドメインモデル 名前探し
増田 亨
PDF
『機械学習による故障予測・異常検知 事例紹介とデータ分析プロジェクト推進ポイント』
The Japan DataScientist Society
PDF
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
Yusuke Suzuki
PDF
相関と因果について考える:統計的因果推論、その(不)可能性の中心
takehikoihayashi
PDF
データ基盤グループを支えるチームビルディング
株式会社MonotaRO Tech Team
PDF
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
Toshihiko Yamakami
PPTX
データ分析の目的に応じた人事、分析組織づくり、データ人材の評価
Takeaki Ohi
PDF
ぞくパタ最終回: 13章「共クラスタリング」
Akifumi Eguchi
PPTX
データ分析基盤を支えるエンジニアリング
Recruit Lifestyle Co., Ltd.
PPTX
CleanArchitecture 第4部 「コンポーネントの原則」
鈴木 セシル
PDF
なぜデータモデリングが重要なのか?
Yoshitaka Kawashima
PDF
RDRA流概念モデル
Zenji Kanzaki
PDF
エスノグラフィック・デザインアプローチ
Masaya Ando
PPTX
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
PPTX
Rでのtry関数によるエラー処理
wada, kazumi
PDF
Agile Quality アジャイル品質パターン (QA2AQ)
Hironori Washizaki
PDF
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
Yoshiki Hayama
PPTX
XAI (説明可能なAI) の必要性
西岡 賢一郎
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
Masashi Umezawa
Webライティング11のルール
Tsutomu Sogitani
リッチなドメインモデル 名前探し
増田 亨
『機械学習による故障予測・異常検知 事例紹介とデータ分析プロジェクト推進ポイント』
The Japan DataScientist Society
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
Yusuke Suzuki
相関と因果について考える:統計的因果推論、その(不)可能性の中心
takehikoihayashi
データ基盤グループを支えるチームビルディング
株式会社MonotaRO Tech Team
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
Toshihiko Yamakami
データ分析の目的に応じた人事、分析組織づくり、データ人材の評価
Takeaki Ohi
ぞくパタ最終回: 13章「共クラスタリング」
Akifumi Eguchi
データ分析基盤を支えるエンジニアリング
Recruit Lifestyle Co., Ltd.
CleanArchitecture 第4部 「コンポーネントの原則」
鈴木 セシル
なぜデータモデリングが重要なのか?
Yoshitaka Kawashima
RDRA流概念モデル
Zenji Kanzaki
エスノグラフィック・デザインアプローチ
Masaya Ando
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
Rでのtry関数によるエラー処理
wada, kazumi
Agile Quality アジャイル品質パターン (QA2AQ)
Hironori Washizaki
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
Yoshiki Hayama
XAI (説明可能なAI) の必要性
西岡 賢一郎
Ad
Similar to ハリボテなx86エミュレータの作り方 - how to make x86 emulator
(20)
PDF
Lisp_chibi_machine 190427
たけおか しょうぞう
PPTX
ASICについて blockchain.tokyo
Misato Takahashi
PDF
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
Atsushi Koshiba
PDF
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
PDF
PFI Seminar 2010/02/18
Preferred Networks
PPTX
Meltdown を正しく理解する
Norimasa FUJITA
PDF
Inkernel disasm-from-intelsdm-kernelvm
Masami Hiramatsu
PDF
Java EE7 䛸㻌JCache
maruyama097
PPTX
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
VxRail ChampionClub
PDF
Lispマシン ドキュメント和訳とか、 ちびLispとか
たけおか しょうぞう
PDF
CPUの同時実行機能
Shinichiro Niiyama
PDF
RISC-V User level ISA
たけおか しょうぞう
PDF
プロセスとコンテキストスイッチ
Kazuki Onishi
PDF
Ext4 filesystem(1)
Yoshihiro Yunomae
PDF
Dataflow140711@Kernel/VM北陸1
たけおか しょうぞう
PDF
Dataflow140711-a@Kernel/VM北陸1
たけおか しょうぞう
PDF
2章 Linuxカーネル - メモリ管理1
mao999
PPTX
C# 7.2 with .NET Core 2.1
信之 岩永
PPT
d-kami x86-2
Daisuke Kamikawa
PDF
半導体
Tetsuya Kimata
Lisp_chibi_machine 190427
たけおか しょうぞう
ASICについて blockchain.tokyo
Misato Takahashi
ASPLOS2017: Building Durable Transactions with Decoupling for Persistent Memory
Atsushi Koshiba
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
PFI Seminar 2010/02/18
Preferred Networks
Meltdown を正しく理解する
Norimasa FUJITA
Inkernel disasm-from-intelsdm-kernelvm
Masami Hiramatsu
Java EE7 䛸㻌JCache
maruyama097
201711 vxrailチャンピオンクラブ_ワークショップ~入門編~テキスト
VxRail ChampionClub
Lispマシン ドキュメント和訳とか、 ちびLispとか
たけおか しょうぞう
CPUの同時実行機能
Shinichiro Niiyama
RISC-V User level ISA
たけおか しょうぞう
プロセスとコンテキストスイッチ
Kazuki Onishi
Ext4 filesystem(1)
Yoshihiro Yunomae
Dataflow140711@Kernel/VM北陸1
たけおか しょうぞう
Dataflow140711-a@Kernel/VM北陸1
たけおか しょうぞう
2章 Linuxカーネル - メモリ管理1
mao999
C# 7.2 with .NET Core 2.1
信之 岩永
d-kami x86-2
Daisuke Kamikawa
半導体
Tetsuya Kimata
Ad
ハリボテな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命令を実装しなければいけませんが…
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