編集部イチオシ

パソコンを回路レベルで自作する (Intel x86 IA-32)

@kaitou_ryaku が一人で作るCPU (x86) の進捗管理用メモ。随時更新。 最新状況(2019/09/21): 自作CPU上の自作OS上でテトリスが動いた 元はこれ https://qiita.com/advent-calendar/2017/lowlayer
146

~重要イベント一覧 (2019/06/22から)~

06/22 作成開始
06/29 32bit加算だけ実行する状態機械が完成
07/17 UARTの送信機を作る
07/18 8bit加算ができるようになる
07/19 ModRM, SIB周りのアドレシングを作り込む
07/20 加算命令がIntel x86の仕様を完全に再現
07/25 加算以外の命令を、一気に48個作る
08/13 Hello Worldが動いた (writeシステムコールの作成)
08/21 自作CPU上で自作OSが動いた
08/27 自作CPU上の自作OSにシェルを実装
09/21 自作CPU上の自作OS上でテトリスが動いた

2019/06/22 作成開始

解答略 @kaitou_ryaku

パソコンを回路レベルで自作している。この土日で完成させたいけど、時間が厳しい。来週中に終われば御の字だな pic.twitter.com/aYDE1V7w1w

2019-06-22 18:19:51
拡大
解答略 @kaitou_ryaku

FPGA詳しいマンが見れば「スイッチ8個をキーボードと称するのはどうなんだ?」とか「いやLED8個をディスプレイと呼ぶのはアカンやろ」とか総スカン喰らうこと必至だが、細かいことは気にすんな

2019-06-22 18:24:09
解答略 @kaitou_ryaku

ハードウェア記述言語をやる際には、あらかじめ紙にブロック図を描いておくのが効率最強だと思う。もし「ノート出すのめんどいな。まぁ俺様の頭脳をもってすれば紙など不要よ」と思っていきなりコーディングし始めると、必ずどこかで配線の向きをミスって時間を溶かす。あと自分の絵が斜めすぎてやばい pic.twitter.com/ZNBKK5DJ4U

2019-06-23 00:24:07
拡大

2019/06/25 x86が可変長命令なので困る。僕が困るということは、Intelのおじさんも困ってるはずで、パイプラインの処理とかどうしてるのか心配になった。ツイッターの優秀な諸氏のおかげで疑問が解決した

解答略 @kaitou_ryaku

Intelのx86 CPUのパイプライン処理の仕組みが謎すぎる。命令長がマジでバラバラだし、命令フェッチ→デコードまで済ませた後でないと次の命令の開始アドレスが分からないと思う。しかしあの命令セットでは、REP・ModRM・SBをデコードするのにかなり時間を取られる気がするし、パイプライン化不可能では

2019-06-25 22:30:40
解答略 @kaitou_ryaku

今作ってるこれをパイプライン化しようと思って、5分ぐらい考えて、そもそもパイプライン化は不可能だと理解してしまった。浮動小数点周りの重い計算はパイプラインが効きそうだけど、他の命令をうまくやるのは無理だ (しかしIntelの中の人は気合と根性と努力で達成している) twitter.com/kaitou_ryaku/s…

2019-06-25 22:36:26
xxqi @idxx

@kaitou_ryaku Skylakeだと16Byte/cycleでキューに乗せてPreDecodeと5-Way Decodeの2段構えでデコードしているようです en.wikichip.org/wiki/intel/mic…

2019-06-25 23:20:06
xxqi @idxx

@kaitou_ryaku PreDecodeの中身がたぶんこのILDかと isus.jp/wp-content/upl… > 2.6.2 フロントエンドの概要 > 1 サイクルあたり最大 16 バイトのアライメントされた命令バイトを、命令キャッシュから命令長デコーダー (ILD) にフェッチします。

2019-06-25 23:56:50
解答略 @kaitou_ryaku

@idxx 情報ありがとうございます!!この図が本質的ですね。命令の長さだけ、先に高速で特定してるのですね。 pic.twitter.com/uWf1Qa80ai

2019-06-26 21:45:13
拡大
解答略 @kaitou_ryaku

この疑問が解決しました。新しめのx86-CPUでは、命令フェッチした直後に「命令長デコーダー」を動かして、命令長だけ高速で特定した後に、じっくりと命令の内容をデコードするっぽいです。割と安直な方法だった。 @idxx さん情報ありがとうございました twitter.com/kaitou_ryaku/s…

2019-06-26 21:51:58

2019/06/29 とりあえずDWORD(32bit)の加算命令
 「ADD r/m ← reg」
のデコード・実行系を完成させる。CPUに命が宿った感。とはいえModRMやSIB周りのアドレシングは杜撰な設計で、BYTE (8bit)命令にも未対応。

解答略 @kaitou_ryaku

などと先週末につぶやいたわけですが、今週ぼちぼちコードを書いてたので、「命令取得→デコード→メモリ読込→実効→メモリ書込→命令取得...」を繰り返すステートマシンは完成しました。とりあえずx86の0x01 (add reg/mem ← reg)の命令だけ実装した。ここまで来れば、あとは命令を増やすだけなのだ twitter.com/kaitou_ryaku/s…

2019-06-29 06:39:31
解答略 @kaitou_ryaku

これまで自作したCPUを数えると、今回で10作目らしい。だいぶ作るコツを掴んだ気がする。何より重要なのは、命令フェッチからライトバックまで一周するステートマシンをさっさと完成させることだ。単純な命令1個のCPUを完動させる。あと、設計段階で構造体とインターフェイスの仕様はしっかり練るべき pic.twitter.com/wj5EINxRMY

2019-06-29 06:47:49
拡大
解答略 @kaitou_ryaku

x86(IA-32)もどき自作CPUのオペコードの実装状況。セグメントレジスタは全て無視。Prefixも全て無視。PUSHAのようなメモリ書き込みが大量発生する命令もサポートしない。簡単にできるところだけやる twitter.com/kaitou_ryaku/s… pic.twitter.com/FOL4Z61dgI

2019-06-30 18:33:32
拡大

↑大量の命令が実装済みに見えるけど、実際は命令長をデコードしてるだけで、その先の処理は全くの未完成

2019/07/01 ここから5日ほど、テストベンチの設計をあれこれ考えていた。結局
「ROMの命令列を無理やり上書き→実行→結果を比較」
という比較テストを並列で動かしまくることにした。要するに結合テストだけ作る。この方式は動作が重いけど、CPU内部のステージ分割方式が変わってもテストベンチに変更が生じない。ステージ毎のテストは、一通りCPUが完成してからデバッグ目的で作ることにした(つまり先延ばしである)。

解答略 @kaitou_ryaku

まだテストベンチを書いてないので、大量の細々したバグが潜んでいるはず。これを一挙に改善する秘策がある。とりあえず命令長だけassertするテストベンチを作るのだ。PCに眠ってる適当な32bit実行ファイルを逆アセンブルして、このCPUに食わせて、命令長が正しく解析できるか全自動でテストするつもり

2019-06-30 18:38:09
解答略 @kaitou_ryaku

例えばCPUを自作する場合は * ALU内部moduleのUnitTest * 全体の結合テスト という2種類のテストをやりたくなる。前者はfork joinで済む。後者が少しトリッキーになる。例えば時刻0でのROMとレジスタを初期設定し、CPUを走らせて、時刻10でassert検証したい。これを何種類も並列実行したいとする(続く)

2019-07-06 16:43:35
解答略 @kaitou_ryaku

(書くの面倒くさくなったので、続くのやめる)

2019-07-06 16:51:12
解答略 @kaitou_ryaku

今作ってるx86(IA-32)のコンピュータ、基本的な部分は全て完成してて、後は実行可能な命令セットをひたすら増やすだけの段階に到達した。テストベンチの書き方の良し悪しで開発効率がぜんぜん違う。ステートマシン部分は作りながら仕様がどんどん変わるけど、ALUはテスト駆動開発でやっていくべきかも twitter.com/kaitou_ryaku/s…

2019-07-06 22:02:49
解答略 @kaitou_ryaku

CPUの定義として「NANDゲートだけで作った逆アセンブラ」というのはどうだろうか

2019-07-06 22:03:30

↑これはx86のデコーダーを作る際にしみじみ思う。もっと簡単な(MIPS等の)命令セットであれば、デコーダーは簡素だし、あまり「言語処理系」を作ってる気分にならないかも

解答略 @kaitou_ryaku

根本的なところがコテコテのアナログ人間なので、x86のCPUを自作するときは家の壁に命令セット表を貼り、C言語コンパイラを自作するときは壁にBNFグラフを貼る。壁ポスターはキモいしダサいけど、なかなか馬鹿にできないぞ。作業効率が格段に上がるし、疲れた時にボーッと眺めることで色々理解が深まる pic.twitter.com/znN3NTFeJQ

2019-07-07 01:59:15
拡大
拡大
残りを読む(87)

コメント

あらⓅ★ @arapix 2019年8月14日
歴史的にみてもパイプラインが実装されたのはずいぶん後だから、端から入れようとするのは随分チャレンジングなのでは。
1
ねるにあ†Ridill @nelnia 2019年8月14日
こういう「普段何気なく使っているモノの仕組みを追いかける感じ」好きだわ(*'-')
9
いぬだわん @InuWang 2019年8月14日
Test and Set とか Compare and Swap あたりを作るのが大変そう
0
PentliumEE @7GHz 2019年8月14日
なぜIA32なんていう魔境を開こうとしたのか。。。
4
kartis56 @kartis56 2019年8月14日
いわゆるマイコンなのではとおもったら、自作してるのCPUのほうか…
0
mikumiku_aloha @mikumiku_aloha 2019年8月14日
こういう事を試すと、何故そんな命令セットになったかがピンと来るようになるのでしょうね。
4
kata_game @kata_game 2019年8月15日
4040とかZ80実装したらいいのになぜIA32なんて高いハードルを……
3
akiba @akibaakiba1111 2019年8月15日
PC8801作ってくれないかな
0
やすだ@詳しくないどころか全くわからない @forth83 2019年8月15日
arapix パイプライン処理は1960年代に見いだされた技術で、x86に限っても取り入れられたのはi486の時ですよ?チャレンジングには同意です。
2
みふゆ@でもどり @mifuyu2175204 2019年8月15日
プログラマーってこれ全部理解してプログラム書いてるの?すごくない?
0
Tadashi @tadashifx 2019年8月15日
テストベンチの重要性には既にお気づきのようだけれど、もうガッツリ趣味になっているようなのでI/O含めた周辺のファンクションモデルを充実させると幸せになれる気がする。
1
SAKURA87@多摩丙丁督 @Sakura87_net 2019年8月15日
何でこんな面倒くさいCPUがデファクトスタンダードなんだ。
1
mikumiku_aloha @mikumiku_aloha 2019年8月15日
Sakura87_net たぶん、こういう自作やるとその理由が分かるのだと思いまう。
0
aitsuki @aitsuki2 2019年8月15日
mifuyu2175204 プログラマーが全てアーキテクチャやってるわけじゃないと思う
0
Toshiya Utoh @toshi_moon 2019年8月15日
なんか、懐かしなぁ。 CPU自作は無いけど、8086載せたボードは自作してた。 chipsetで丸めてるけど、pioとsioを完全に分けたほうが作りやすそう(内部的にはそうなってるんでしょうけど) ロジアナでちまちまタイミングデバッグしてたのも懐かしい。 このツイ見ると、cpuとか作りたくなってしまう。 その時のバイブルは、intelのシートよりも、丸善の8086解説本。
0
ネギ@冗談じゃねえ… @negi__ 2019年8月15日
mifuyu2175204 むしろ大多数のプログラマが, 機械語なら分かる人, C言語なら分かる人, Pythonでディープラーニングならできる人, みたいに各々の興味ある抽象度で仕事できるのがプログラミングの面白いところ. ただしごく一部のスーパーハカーは全部わかる
0
たかりゃん@社会復帰リハビリ中 @kakitaka 2019年8月17日
徐々に進歩していくのが楽しいよね。 なかなかこういう記録付けるのが億劫で、残しておけばなあと思うことは多々ある
0
相模川のおじさん(さがおじ) @hyu954 2019年8月18日
スイッチがキーボードでLEDがディスプレイってAltair8800かな
1
BUNTEN @bunten 2019年8月18日
hyu954 タッチの差で書かれてしまっているが、「「スイッチ8個をキーボードと称するのはどうなんだ?」とか「いやLED8個をディスプレイと呼ぶのはアカンやろ」とか」いうのが普通だった時代は確かにあった。
0
みなも @X___MOON___X 2019年8月18日
個人的にはスイッチ 9 個で 510 通り入力出来る自作キーボード作ってるから 8 個あれば十分って思った。 ( 8 個 で 254 通り入力出来ると思うからフルキーボード分 108 キーとかはカバー出来るハズ)
0
WicKid @wickid101 2019年8月28日
mifuyu2175204 ITはユニット式のプレハブ建築のの様に人も技術も役割分担されているので、ほとんどの人は理解していない(する必要がない)です。 時々、DASH村みたいに全部挑戦したり出来たりする人は居ますが…
0
Urushibara @tsuji_pneuma 2019年9月8日
mifuyu2175204 こんなの意識してプログラムする人はごく一部。組み込み系メインの人なら意識する必要ありますけど、WebのスクリプトとかはCPUの知識は全く必要ないです。
0
解答略 @kaitou_ryaku 2019年12月3日
まとめを更新しました。
0