ゼロから始める自作 cpu 入門

38
ゼロから始める自作 CPU 入門 セキュリティ・キャンプフォーラム2015 ローレイヤー勉強会

Upload: hirotaka-kawata

Post on 16-Jul-2015

12.570 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: ゼロから始める自作 CPU 入門

ゼロから始める自作CPU 入門セキュリティ・キャンプフォーラム2015

ローレイヤー勉強会

Page 2: ゼロから始める自作 CPU 入門

お前だれよ

● 川田裕貴@hktechno

o 筑波大学システム情報工学研究科コンピュータサイエンス専攻 M1

o セキュリティ&プログラミングキャンプ2008 プログラミングコース参加 2009, 10, 12 OS 組チューター

Page 3: ゼロから始める自作 CPU 入門

とても、ローレイヤーな話をします

Page 4: ゼロから始める自作 CPU 入門

低レイヤとは システムソフトウェア

VM

OS Kernel

アセンブラ

バイナリ

CPUCPUマニアが考えるローレイヤ

Page 5: ゼロから始める自作 CPU 入門

自作PC != 自作コンピュータ

本格的自作コンピューター

自作コンピューターというのであれば、CPU

から作らなければ!

・命令セット・MMU

・IOコントローラ全部作る

Page 6: ゼロから始める自作 CPU 入門

Open Design Computer Project

● オリジナル ”コンピューター”を作ったo CPU だけじゃないo 基板から、CPU から、ペリフェラルまで

● 2011年度 IPA未踏 IT 人材発掘育成事業採択● http://open-arch.org/

● ↓一緒にやってる人@cpu_labs

Page 7: ゼロから始める自作 CPU 入門

mist32 プロセッサ

● 名前の由来はわからないw

● 32bit RISC アーキテクチャ● 2オペランド● Out of order 実行● レジスタリネーミング● 投機的実行● オープンソース

Page 8: ゼロから始める自作 CPU 入門

CPU も自作できる

● がんばれば。

Page 9: ゼロから始める自作 CPU 入門

CPU 自作って楽しいの?

● 楽しい。● 作りながら学べる。

● 理由:

o やってる人が少ないo なんかかっこいいo 自分の好きなように設計できるo 上から下まで全部自由

Page 10: ゼロから始める自作 CPU 入門

自作 CPU で広がる夢

● CPU を自作することで....

o こんな命令があればセキュアになるのにo こんな機能があればセキュアになるのにo こんな命令セットもうイヤだ!o ぼくのかんがえたさいきょうの CPU!

Page 11: ゼロから始める自作 CPU 入門

自作 CPU を作ってどうする?

● 考えてはいけない。● とりあえず作ってみると楽しい

● 期待してはいけないこと:

o 既存の CPU より性能の良い物ができるo 誰かに使ってもらえるo 実用性o 就活の役に立つ

Page 12: ゼロから始める自作 CPU 入門

CPU 自作のメリット

● 得ることができる特殊能力o C のコードから吐かれるアセンブラがわかるようになる

o アセンブラからバイナリが想像できるようになる

o アセンブラの命令列から、命令がどうやって実行されるかがわかる

Page 13: ゼロから始める自作 CPU 入門

とりあえず、自作 CPU の民を増やしたい!

Page 14: ゼロから始める自作 CPU 入門

そもそも CPU とは

● 何が違うかo アセンブラが違うだけ?

● Intel x86

● Power PC

● SPARC

● ARM Cortex-A

● ARM Cortex-M

● AVR

● PIC

Page 15: ゼロから始める自作 CPU 入門

CPU の分類?

Page 16: ゼロから始める自作 CPU 入門

CPU 自作の構成要素

● ISA (命令セットアーキテクチャ)

● プロセッサコア● ペリフェラル

o MMU

o 割り込みo タイマーo など...

● ソフトウェアo アセンブラ, コンパイラ, OS...

Page 17: ゼロから始める自作 CPU 入門

ISA (命令セット)

● 自作 CPU の唯一?見える部分o バイナリ、アセンブラは見ることが可能

● ISA の設計は楽しい● バグが発生しない!● バイナリアンの君なら、きっと既存の ISA

への不満もたまってるはず

Page 18: ゼロから始める自作 CPU 入門

ISA (命令セット)

● 命令フォーマットo 種類、オペランドの数、どうやってバイナリに詰め込むかなど...

● ニーモニックo add, sub, shr, sar, jxx…

● どんな命令を用意するかo 変態命令をつけるとかo 例えば、”短歌”に最適化された命令

Page 19: ゼロから始める自作 CPU 入門

ISA の例

● 固定長 4byte

● 半固定長 2byte, 4byte

● 可変長

● 変種o BPT(Byte Per Tanka)世界一の命令セットo 絶対 ASCII が現れない命令セットo 全部 ASCII で書ける命令セット

Page 20: ゼロから始める自作 CPU 入門

プロセッサコア

● 命令の実行ユニットを何かしらで作る

● 一番の肝o 工夫をたくさん入れるo 先人たちの知識を利用するo または、全く新しいものを作る

Page 21: ゼロから始める自作 CPU 入門

4bit CPU の回路

Page 22: ゼロから始める自作 CPU 入門

どうやってコアを書くか

● FPGA を使うo 回路を動的に構成できる魔法の LSI

o Verilog HDL とか VHDL を使って書く

● FPGA は速い!は間違いo 実際の素子と比べると、とても遅い。o 特別な処理を回路に起こすと、速い

(ただし、専用の IC よりはずっと遅い)

Page 23: ゼロから始める自作 CPU 入門

基本的なパイプライン

● Instruction Fetch

● Instruction Decode

● Execution

o Memory Access

● Write Back

Page 24: ゼロから始める自作 CPU 入門

● Instruction Fetch

● Instruction Buffer

● Instruction Decode

● Dispatch

● Execution

MIST32 (In-order: MIST1032ISA)

IB

Page 25: ゼロから始める自作 CPU 入門

実行ポート4個 OoOな領域

2命令同時Fetch

Decode

(Super-

Scalar)

Page 26: ゼロから始める自作 CPU 入門

● ほとんどのプロセッサでは、アセンブラの通りには実行されていないo 高速化のためo ハードウェアが実行しやすいように実行したほうが速い

● ソフトウェアで頑張ればよいのでは?o 夢の VLIW...

アセンブラと実行順序

Page 27: ゼロから始める自作 CPU 入門

Out of Order Execution (例)

mov eax, [eax]

xor ebx, ebx

add ebx, eax

inc ecx

add eax, ecx

Load (遅い)

↑の命令とは依存がない

↑の命令とは依存がない

1

1

2

1

2

命令の順番を入れ替えても構わないしかも、開いてるポートに並列に実行できる

Page 28: ゼロから始める自作 CPU 入門

Out of Order Execution

● Register Renaming

o 物理レジスタを仮想レジスタにリネームo 命令の依存をより少なくできる

mov eax, [eax]

inc eax

mov [eax], eax

mov eax, ebx

mov eax, [eax]

同じ eax レジスタだが、依存はない

← 先に実行可能

Page 29: ゼロから始める自作 CPU 入門
Page 30: ゼロから始める自作 CPU 入門

http://arstechnica.com/business/2010/09/intels-next-must-have-upgrade-a-look-at-sandy-bridge/

Page 31: ゼロから始める自作 CPU 入門

プロセッサコアの設計

● レジスタo 何 bit でいくつ用意するか

● パイプラインo どういう構成で、何段にするか

● 実行ユニットo 何個用意するか、並列化させるか

● その他もろもろo 分岐予測、投機的実行など...

Page 32: ゼロから始める自作 CPU 入門

プロセッサコアと ISA

● 便利な命令や、複雑な命令をたくさん積めばいいじゃないか?o そういうわけにも行かない

● 回路規模o 複雑な実行ユニットは、回路規模が大きくなる、クリティカルパスが長くなる

o クロックが上がらなくなる

Page 33: ゼロから始める自作 CPU 入門

MMU とか

● 作らなくても良い● ただし、OS を動かすには普通は必要

● 実は作るのが結構大変o ページテーブルを考えたり、

TLB の事を考えたり...

Page 34: ゼロから始める自作 CPU 入門

シミュレータ

● 実機より信頼の置けるシミュレータo シミュレータが信頼出来ないとデバッグで死ぬ!

● 簡単なものでもいいからつくろうo cycle-accurate でなくてもよい

● シミュレータの高速化も、また楽しい

Page 35: ゼロから始める自作 CPU 入門

アセンブラ・コンパイラ

● コアだけでは、プログラムは書けないo ハンドアセンブルで書く人は除く

● アセンブラやコンパイラが必要o 一般的には binutils, gcc を使うが?o 簡単なものなら自作も可能

Page 36: ゼロから始める自作 CPU 入門

オペレーティングシステム

● OS も自作可能、だが...

● mist32 向けには xv6 を移植したo Unix V6 っぽい何かo その上で mruby もうごくo http://www.slideshare.net/hktechno/xv6-mist32-mruby

Page 37: ゼロから始める自作 CPU 入門

OS を移植すると...

● OS のことも学べるo どうやって起動するのかo OS を動かすにはどんな機能が必要かo どうすれば、もっと速く OS を実行できるか...

Page 38: ゼロから始める自作 CPU 入門

まとめ

CPU を自作すると...

低レイヤーな知識が大体学べる。超楽しい。

ソフトウェアの高速化、OS の作り方、コンパイラ・アセンブラ、CPU のパイプラインの中身、などを学びたいなら CPU を作ろう。