114

~重要イベント一覧 (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 自作OSが動いた

2019/06/22 作成開始
解答略 @kaitou_ryaku
パソコンを回路レベルで自作している。この土日で完成させたいけど、時間が厳しい。来週中に終われば御の字だな pic.twitter.com/aYDE1V7w1w
拡大
解答略 @kaitou_ryaku
FPGA詳しいマンが見れば「スイッチ8個をキーボードと称するのはどうなんだ?」とか「いやLED8個をディスプレイと呼ぶのはアカンやろ」とか総スカン喰らうこと必至だが、細かいことは気にすんな
解答略 @kaitou_ryaku
ハードウェア記述言語をやる際には、あらかじめ紙にブロック図を描いておくのが効率最強だと思う。もし「ノート出すのめんどいな。まぁ俺様の頭脳をもってすれば紙など不要よ」と思っていきなりコーディングし始めると、必ずどこかで配線の向きをミスって時間を溶かす。あと自分の絵が斜めすぎてやばい pic.twitter.com/ZNBKK5DJ4U
拡大

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

解答略 @kaitou_ryaku
Intelのx86 CPUのパイプライン処理の仕組みが謎すぎる。命令長がマジでバラバラだし、命令フェッチ→デコードまで済ませた後でないと次の命令の開始アドレスが分からないと思う。しかしあの命令セットでは、REP・ModRM・SBをデコードするのにかなり時間を取られる気がするし、パイプライン化不可能では
解答略 @kaitou_ryaku
今作ってるこれをパイプライン化しようと思って、5分ぐらい考えて、そもそもパイプライン化は不可能だと理解してしまった。浮動小数点周りの重い計算はパイプラインが効きそうだけど、他の命令をうまくやるのは無理だ (しかしIntelの中の人は気合と根性と努力で達成している) twitter.com/kaitou_ryaku/s…
xxqi @idxx
@kaitou_ryaku Skylakeだと16Byte/cycleでキューに乗せてPreDecodeと5-Way Decodeの2段構えでデコードしているようです en.wikichip.org/wiki/intel/mic…
xxqi @idxx
@kaitou_ryaku PreDecodeの中身がたぶんこのILDかと isus.jp/wp-content/upl… > 2.6.2 フロントエンドの概要 > 1 サイクルあたり最大 16 バイトのアライメントされた命令バイトを、命令キャッシュから命令長デコーダー (ILD) にフェッチします。
解答略 @kaitou_ryaku
@idxx 情報ありがとうございます!!この図が本質的ですね。命令の長さだけ、先に高速で特定してるのですね。 pic.twitter.com/uWf1Qa80ai
拡大
解答略 @kaitou_ryaku
この疑問が解決しました。新しめのx86-CPUでは、命令フェッチした直後に「命令長デコーダー」を動かして、命令長だけ高速で特定した後に、じっくりと命令の内容をデコードするっぽいです。割と安直な方法だった。 @idxx さん情報ありがとうございました twitter.com/kaitou_ryaku/s…

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…
解答略 @kaitou_ryaku
これまで自作したCPUを数えると、今回で10作目らしい。だいぶ作るコツを掴んだ気がする。何より重要なのは、命令フェッチからライトバックまで一周するステートマシンをさっさと完成させることだ。単純な命令1個のCPUを完動させる。あと、設計段階で構造体とインターフェイスの仕様はしっかり練るべき pic.twitter.com/wj5EINxRMY
拡大
解答略 @kaitou_ryaku
x86(IA-32)もどき自作CPUのオペコードの実装状況。セグメントレジスタは全て無視。Prefixも全て無視。PUSHAのようなメモリ書き込みが大量発生する命令もサポートしない。簡単にできるところだけやる twitter.com/kaitou_ryaku/s… pic.twitter.com/FOL4Z61dgI
拡大

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

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

解答略 @kaitou_ryaku
まだテストベンチを書いてないので、大量の細々したバグが潜んでいるはず。これを一挙に改善する秘策がある。とりあえず命令長だけassertするテストベンチを作るのだ。PCに眠ってる適当な32bit実行ファイルを逆アセンブルして、このCPUに食わせて、命令長が正しく解析できるか全自動でテストするつもり
解答略 @kaitou_ryaku
例えばCPUを自作する場合は * ALU内部moduleのUnitTest * 全体の結合テスト という2種類のテストをやりたくなる。前者はfork joinで済む。後者が少しトリッキーになる。例えば時刻0でのROMとレジスタを初期設定し、CPUを走らせて、時刻10でassert検証したい。これを何種類も並列実行したいとする(続く)
解答略 @kaitou_ryaku
(書くの面倒くさくなったので、続くのやめる)
解答略 @kaitou_ryaku
今作ってるx86(IA-32)のコンピュータ、基本的な部分は全て完成してて、後は実行可能な命令セットをひたすら増やすだけの段階に到達した。テストベンチの書き方の良し悪しで開発効率がぜんぜん違う。ステートマシン部分は作りながら仕様がどんどん変わるけど、ALUはテスト駆動開発でやっていくべきかも twitter.com/kaitou_ryaku/s…
解答略 @kaitou_ryaku
CPUの定義として「NANDゲートだけで作った逆アセンブラ」というのはどうだろうか

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

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

コメント

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