ゼロから始める自作
CPU 入門
セキュリティ・キャンプフォーラム2015
ローレイヤー勉強会
お前だれよ
● 川田 裕貴 @hktechno
o 筑波大学 システム情報工学研究科
コンピュータサイエンス専攻 M1
o セキュリティ&プログラミングキ
ャンプ
2008 プログラミングコース参加
 2009, 10, 12 OS 組チューター
とても、ローレイヤーな話をします
低レイヤとは システムソフトウェア
VM
OS Kernel
アセンブラ
バイナリ
CPU
CPUマニアが考
えるローレイヤ
自作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 を作ろう。

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