ゼロから始める自作CPU 入門セキュリティ・キャンプフォーラム2015
ローレイヤー勉強会
お前だれよ
● 川田裕貴@hktechno
o 筑波大学システム情報工学研究科コンピュータサイエンス専攻 M1
o セキュリティ&プログラミングキャンプ2008 プログラミングコース参加 2009, 10, 12 OS 組チューター
とても、ローレイヤーな話をします
低レイヤとは システムソフトウェア
VM
OS Kernel
アセンブラ
バイナリ
CPUCPUマニアが考えるローレイヤ
自作PC != 自作コンピュータ
本格的自作コンピューター
自作コンピューターというのであれば、CPU
から作らなければ!
・命令セット・MMU
・IOコントローラ全部作る
Open Design Computer Project
● オリジナル ”コンピューター”を作ったo CPU だけじゃないo 基板から、CPU から、ペリフェラルまで
● 2011年度 IPA未踏 IT 人材発掘育成事業採択● http://open-arch.org/
● ↓一緒にやってる人@cpu_labs
mist32 プロセッサ
● 名前の由来はわからないw
● 32bit RISC アーキテクチャ● 2オペランド● Out of order 実行● レジスタリネーミング● 投機的実行● オープンソース
CPU も自作できる
● がんばれば。
CPU 自作って楽しいの?
● 楽しい。● 作りながら学べる。
● 理由:
o やってる人が少ないo なんかかっこいいo 自分の好きなように設計できるo 上から下まで全部自由
自作 CPU で広がる夢
● CPU を自作することで....
o こんな命令があればセキュアになるのにo こんな機能があればセキュアになるのにo こんな命令セットもうイヤだ!o ぼくのかんがえたさいきょうの CPU!
自作 CPU を作ってどうする?
● 考えてはいけない。● とりあえず作ってみると楽しい
● 期待してはいけないこと:
o 既存の CPU より性能の良い物ができるo 誰かに使ってもらえるo 実用性o 就活の役に立つ
CPU 自作のメリット
● 得ることができる特殊能力o C のコードから吐かれるアセンブラがわかるようになる
o アセンブラからバイナリが想像できるようになる
o アセンブラの命令列から、命令がどうやって実行されるかがわかる
とりあえず、自作 CPU の民を増やしたい!
そもそも CPU とは
● 何が違うかo アセンブラが違うだけ?
● Intel x86
● Power PC
● SPARC
● ARM Cortex-A
● ARM Cortex-M
● AVR
● PIC
CPU の分類?
CPU 自作の構成要素
● ISA (命令セットアーキテクチャ)
● プロセッサコア● ペリフェラル
o MMU
o 割り込みo タイマーo など...
● ソフトウェアo アセンブラ, コンパイラ, OS...
ISA (命令セット)
● 自作 CPU の唯一?見える部分o バイナリ、アセンブラは見ることが可能
● ISA の設計は楽しい● バグが発生しない!● バイナリアンの君なら、きっと既存の ISA
への不満もたまってるはず
ISA (命令セット)
● 命令フォーマットo 種類、オペランドの数、どうやってバイナリに詰め込むかなど...
● ニーモニックo add, sub, shr, sar, jxx…
● どんな命令を用意するかo 変態命令をつけるとかo 例えば、”短歌”に最適化された命令
ISA の例
● 固定長 4byte
● 半固定長 2byte, 4byte
● 可変長
● 変種o BPT(Byte Per Tanka)世界一の命令セットo 絶対 ASCII が現れない命令セットo 全部 ASCII で書ける命令セット
プロセッサコア
● 命令の実行ユニットを何かしらで作る
● 一番の肝o 工夫をたくさん入れるo 先人たちの知識を利用するo または、全く新しいものを作る
4bit CPU の回路
どうやってコアを書くか
● FPGA を使うo 回路を動的に構成できる魔法の LSI
o Verilog HDL とか VHDL を使って書く
● FPGA は速い!は間違いo 実際の素子と比べると、とても遅い。o 特別な処理を回路に起こすと、速い
(ただし、専用の IC よりはずっと遅い)
基本的なパイプライン
● Instruction Fetch
● Instruction Decode
● Execution
o Memory Access
● Write Back
● Instruction Fetch
● Instruction Buffer
● Instruction Decode
● Dispatch
● Execution
MIST32 (In-order: MIST1032ISA)
IB
実行ポート4個 OoOな領域
2命令同時Fetch
Decode
…
(Super-
Scalar)
● ほとんどのプロセッサでは、アセンブラの通りには実行されていないo 高速化のためo ハードウェアが実行しやすいように実行したほうが速い
● ソフトウェアで頑張ればよいのでは?o 夢の VLIW...
アセンブラと実行順序
Out of Order Execution (例)
mov eax, [eax]
xor ebx, ebx
add ebx, eax
inc ecx
add eax, ecx
Load (遅い)
↑の命令とは依存がない
↑の命令とは依存がない
1
1
2
1
2
命令の順番を入れ替えても構わないしかも、開いてるポートに並列に実行できる
Out of Order Execution
● Register Renaming
o 物理レジスタを仮想レジスタにリネームo 命令の依存をより少なくできる
mov eax, [eax]
inc eax
mov [eax], eax
mov eax, ebx
mov eax, [eax]
同じ eax レジスタだが、依存はない
← 先に実行可能
http://arstechnica.com/business/2010/09/intels-next-must-have-upgrade-a-look-at-sandy-bridge/
プロセッサコアの設計
● レジスタo 何 bit でいくつ用意するか
● パイプラインo どういう構成で、何段にするか
● 実行ユニットo 何個用意するか、並列化させるか
● その他もろもろo 分岐予測、投機的実行など...
プロセッサコアと ISA
● 便利な命令や、複雑な命令をたくさん積めばいいじゃないか?o そういうわけにも行かない
● 回路規模o 複雑な実行ユニットは、回路規模が大きくなる、クリティカルパスが長くなる
o クロックが上がらなくなる
MMU とか
● 作らなくても良い● ただし、OS を動かすには普通は必要
● 実は作るのが結構大変o ページテーブルを考えたり、
TLB の事を考えたり...
シミュレータ
● 実機より信頼の置けるシミュレータo シミュレータが信頼出来ないとデバッグで死ぬ!
● 簡単なものでもいいからつくろうo cycle-accurate でなくてもよい
● シミュレータの高速化も、また楽しい
アセンブラ・コンパイラ
● コアだけでは、プログラムは書けないo ハンドアセンブルで書く人は除く
● アセンブラやコンパイラが必要o 一般的には binutils, gcc を使うが?o 簡単なものなら自作も可能
オペレーティングシステム
● OS も自作可能、だが...
● mist32 向けには xv6 を移植したo Unix V6 っぽい何かo その上で mruby もうごくo http://www.slideshare.net/hktechno/xv6-mist32-mruby
OS を移植すると...
● OS のことも学べるo どうやって起動するのかo OS を動かすにはどんな機能が必要かo どうすれば、もっと速く OS を実行できるか...
まとめ
CPU を自作すると...
低レイヤーな知識が大体学べる。超楽しい。
ソフトウェアの高速化、OS の作り方、コンパイラ・アセンブラ、CPU のパイプラインの中身、などを学びたいなら CPU を作ろう。