Slide 1

Slide 1 text

エミュレータを作ろう sksat cybozu labs youth 7th CombNaf 3 @2018.3/25

Slide 2

Slide 2 text

自己紹介 sksat Twitter: @sksat_tty GitHub: @sk2sat 高2(B2ではない seccamp 2016 cybozu labs youth 7th tus-uc 3th etc...

Slide 3

Slide 3 text

最近あった嬉しいこと

Slide 4

Slide 4 text

ちょこっとラボユースの話 サイボウズ・ラボユースは、世界に通用する日本の若手エンジニアの発 掘と育成を目指すことを目的とし、学生の若手クリエイターに研究開発の 機会を提供する場として、 2011年3月31日に設立されました。 ようするに ・ガチプロに教えてもらえる ・お金がもらえる ・OSSが開発できる ・柔軟な対応

Slide 5

Slide 5 text

今日の話題 みなさん,エミュレータ作ってますか??? 教えてください!!! はい いいえ 作りましょう!!!

Slide 6

Slide 6 text

エミュレータ is 何

Slide 7

Slide 7 text

エミュレータ コンピュータの機能・動作をエミュレートするソフトウェア

Slide 8

Slide 8 text

普通のプログラム OSが動く ✕ (OSの上で) アプリケーションが動く

Slide 9

Slide 9 text

エミュレータ プログラム上で コンピュータを エミュレートする \ヨウ/

Slide 10

Slide 10 text

代表的なエミュレータ チ ョ ッ ト チ ガ ウ

Slide 11

Slide 11 text

エミュレータをつくるには コンピュータのしくみを完全理解 プログラムに落とし込む

Slide 12

Slide 12 text

エミュレータをつくると コンピュータのしくみを完全理解 エミュレータをつくる

Slide 13

Slide 13 text

ゆるふわ自作エミュレータ入門

Slide 14

Slide 14 text

コンピュータってどうやって動いてるの BIOS/UEFIがプログラムをメモリに読み出す ローダーが起動 OSが起動

Slide 15

Slide 15 text

これをプログラムにすればいい

Slide 16

Slide 16 text

何をエミュレートするか? ・いきなり Linux とかはムズカシイ →機能が多い・使うデバイス /CPU の機能も多い ・ミニマルな OS が欲しい →無いなら作ればいいじゃない

Slide 17

Slide 17 text

自作OS ・みなさん OS 作ってますか? ・コミュニティ: osdev-jp オフ会:自作 OS もくもく会(昨日あった) ・自作 OS といえば? →はりぼて OS

Slide 18

Slide 18 text

みんなだいすきはりぼてOS ・30日でできる! ・ゆるふわ ・小さい →エミュレートしやすい!

Slide 19

Slide 19 text

はりぼてOS ・ x86 32bit ・ブートメディア →フロッピー ・ページング無し

Slide 20

Slide 20 text

はりぼてOSのブート フロッピーディスク (保存のアイコンではない )

Slide 21

Slide 21 text

IPL:初期プログラムローダー おわかりいただけただろうか...

Slide 22

Slide 22 text

プログラムのしくみ \ウマイ/ プログラム(機械語)

Slide 23

Slide 23 text

エミュレータでは... \ウマイ/ プログラム(機械語)

Slide 24

Slide 24 text

CPUの気持ちになる 持ち物 ・熱い気持ち ・SDM

Slide 25

Slide 25 text

SDMとは? Intel® 64 and IA-32 architectures software developer’s manual

Slide 26

Slide 26 text

結論 CSの全ての分野に精通したい! コンピュータのしくみを完全理解したい! エミュレータをつくりたい! SDMオイシイ!

Slide 27

Slide 27 text

SDMムズイ それな. よくわからん疑似コードとかある OSやエミュレータを自作 わかる!

Slide 28

Slide 28 text

SDMを読んでイく

Slide 29

Slide 29 text

基本実行環境

Slide 30

Slide 30 text

ようするに メモリ ・いっぱいデータを置いておける ・1つだけある レジスタ ・少しデータを置いておける ・いっぱいある

Slide 31

Slide 31 text

プログラムに落とすと メモリ std::vector memory; レジスタ uint32_t eax, ecx, edx, ebx, esp, ebp, edi; 実行環境はできた →メモリにプログラムを置く →実行!

Slide 32

Slide 32 text

機械語のフォーマット

Slide 33

Slide 33 text

プログラムの実行

Slide 34

Slide 34 text

プログラムの実行    実行

Slide 35

Slide 35 text

プログラムの実行    実行

Slide 36

Slide 36 text

プログラムの実行    実行

Slide 37

Slide 37 text

プログラムの実行    実行

Slide 38

Slide 38 text

プログラムの実行    実行

Slide 39

Slide 39 text

プログラムの実行    実行

Slide 40

Slide 40 text

プログラムの実行    実行 どこの機械語を実行するか? ↓ EIPレジスタ:プログラムカウンタ

Slide 41

Slide 41 text

まとめると while(true){ // 機械語を1つ実行 ExecOpcode(memory, eip); }

Slide 42

Slide 42 text

まとめると void ExecOpcode(Memory& memory, uint32_t& eip){ uint8_t prefix, opcode, modrm, sib; uint32_t disp32, imm32; prefix = memory[eip]; eip++; opcode = memory[eip]; eip++; ... }

Slide 43

Slide 43 text

ゆるふわに学びたい! かわいい!(ヽ *゚▽゚*)ノ

Slide 44

Slide 44 text

俺は熱い!!!!

Slide 45

Slide 45 text

作っているエミュレータ https://github.com/sk2sat/emu starをくれると喜ぶ