「コンピュータシステムの理論と実装」を読んだメモを書いていきます。
前回は↓
メモ
メモリ
CPU
- 計算の実行、メモリに対する値の読み書き、他のプログラムへのジャンプを行なう
- ALU, レジスタ, 制御ユニットというハードウェアを使って処理を実現する
- ALU
- 算術演算, 論理演算を行なう
- レジスタ
- 制御ユニット
- バイナリで表現された命令をハードウェアで実行するための信号にデコードする
- 次に実行する命令の情報を保持する
- CPUのループ処理
- メモリから命令(ワード)をフェッチする
- 命令をデコードする
- 命令を実行する
- 次の命令をフェッチする
- 命令を実行するときには以下をおこなう
- ALUによる計算
- 内部レジスタの操作
- メモリに対するワードの読み書き
レジスタ
- CPUからRAMに対してアドレスjの値を読み込む命令を出した場合
- メモリアクセスには時間がかかる
- メモリ間の往復やメモリ中の 探索があるため
- レジスタは時間がかからない
- CPU回路の中に物理的に存在するため、アクセスの時間は一瞬
- レジスタは数個しか存在しないため、探索の時間は一瞬
- コンピュータアーキテクチャによってレジスタの種類は目的は様々
入出力
- メモリマップドI/O
- CPUは各入力デバイスを割り当てられるメモリ領域のベースアドレスを知るだけでよい
実装
Hackコンピュータを実装する。詳細は以下。
- データメモリの実装
- RAM16K, Screen, Keyboard回路を利用して連続したメモリ領域を保持するメモリを実装する
- 連続したメモリ領域を実装する方法は3章のRAMの実装と同じ
- CPUの実装
- 命令のデコード
- 命令メモリから読み込んだ命令をデコードして制御ビットを読み込む
- A命令の場合 i xxxxxxxxxxxxxxx
- 先頭ビットは0, 以降のビットはアドレスを表現する
- C命令の場合 i xx a cccccc ddd jjj
- 先頭ビットは1, 次の2ビットは使わない, 以降のビットはcomp, dest, jump をそれぞれ表現する
- 命令の実行
- 命令のフェッチ
- ALUのステータスビット(ng, zr)とPCを利用して、次の命令が格納されている命令メモリのアドレスを指定する
- 命令のデコード
- 命令メモリ
- ビルトインのROM32K回路を利用する
- Computerの実装
- データメモリとCPUと命令メモリを使って実装する 実際のコードは以下。
感想
- 命令のフェッチ処理でALUのステータスビットとPC回路をつかって、jump条件を表現する回路を作るところで、条件の考慮もれがあって半日使ってしまった
- ノイマン型アーキテクチャのコンピュータを作ることで、メモリやCPUの動作を回路レベルで知ることができた
- 実際にハードウェアシミュレータ上で、自分が作ったコンピュータがプログラムを実行する過程を見ることができるのは感慨深い
次章はこちら