daisuzz.log

"コンピュータシステムの理論と実装 第5章 コンピュータアーキテクチャ" を読んだ

「コンピュータシステムの理論と実装」を読んだメモを書いていきます。

前回は↓

iikanji.hatenablog.jp

メモ

メモリ

  • 計算したデータと命令を格納する
  • 高級言語の変数、配列、オブジェクトなどはデータメモリに格納される
  • 高級言語の命令はバイナリのワードに変換されて、命令メモリに格納される

CPU

  • 計算の実行、メモリに対する値の読み書き、他のプログラムへのジャンプを行なう
  • ALU, レジスタ, 制御ユニットというハードウェアを使って処理を実現する
  • ALU
    • 算術演算, 論理演算を行なう
  • レジスタ
    • パフォーマンスの向上のためにメモリに格納する代わりとしてレジスタを利用する
    • CPUには高速なレジスタが少数備えられている
  • 制御ユニット
    • バイナリで表現された命令をハードウェアで実行するための信号にデコードする
    • 次に実行する命令の情報を保持する
    • CPUのループ処理
      • メモリから命令(ワード)をフェッチする
      • 命令をデコードする
      • 命令を実行する
      • 次の命令をフェッチする
    • 命令を実行するときには以下をおこなう
      • ALUによる計算
      • 内部レジスタの操作
      • メモリに対するワードの読み書き

レジスタ

  • CPUからRAMに対してアドレスjの値を読み込む命令を出した場合
    • CPUからRAMにアドレスjを送る
    • RAMは入力されたアドレスに対応するメモリレジスタを選ぶ
    • メモリレジスタの値をCPUに送る
  • メモリアクセスには時間がかかる
    • メモリ間の往復やメモリ中の 探索があるため
  • レジスタは時間がかからない
    • CPU回路の中に物理的に存在するため、アクセスの時間は一瞬
    • レジスタは数個しか存在しないため、探索の時間は一瞬
  • コンピュータアーキテクチャによってレジスタの種類は目的は様々
    • データレジスタ
      • 簡易的なメモリ
      • データの一時保存のために使われる
    • アドレスレジスタ
      • CPUからメモリにアクセスするためのアドレスを保存しておくために使われる
    • プログラムカウンタレジスタ
      • CPUが次に実行する命令のアドレスを保存しておくために使われる
      • CPUはプログラムカウンタレジスタに保存されたアドレスを使って命令メモリから命令をフェッチする
      • 現在の命令にgotoが含まれていなければ、CPUはプログラムカウンタをインクリメント
      • 現在の命令にgoto nが含まれていれば、CPUはプログラムカウンタにnを書き込む

入出力

  • メモリマップドI/O
    • 入出力デバイスをメモリ上に展開することで、CPUは入出力デバイスをメモリ領域として扱うことができる
    • 入力デバイスの状態が変化すると対応するメモリ領域の各ビットが更新される
    • 出力デバイスの状態の更新には、対応するメモリ領域の各ビットを更新する
  • CPUは各入力デバイスを割り当てられるメモリ領域のベースアドレスを知るだけでよい

実装

Hackコンピュータを実装する。詳細は以下。

  • データメモリの実装
    • RAM16K, Screen, Keyboard回路を利用して連続したメモリ領域を保持するメモリを実装する
    • 連続したメモリ領域を実装する方法は3章のRAMの実装と同じ
  • CPUの実装
    • 命令のデコード
      • 命令メモリから読み込んだ命令をデコードして制御ビットを読み込む
      • A命令の場合 i xxxxxxxxxxxxxxx
        • 先頭ビットは0, 以降のビットはアドレスを表現する
      • C命令の場合 i xx a cccccc ddd jjj
        • 先頭ビットは1, 次の2ビットは使わない, 以降のビットはcomp, dest, jump をそれぞれ表現する
    • 命令の実行
      • デコードによって読み込んだ制御ビットをAレジスタ, Dレジスタ, ALU, PC, Muxなど様々な回路に入力して、命令を実行する
    • 命令のフェッチ
      • ALUのステータスビット(ng, zr)とPCを利用して、次の命令が格納されている命令メモリのアドレスを指定する
  • 命令メモリ
    • ビルトインのROM32K回路を利用する
  • Computerの実装
    • データメモリとCPUと命令メモリを使って実装する 実際のコードは以下。

github.com

感想

  • 命令のフェッチ処理でALUのステータスビットとPC回路をつかって、jump条件を表現する回路を作るところで、条件の考慮もれがあって半日使ってしまった
  • ノイマンアーキテクチャのコンピュータを作ることで、メモリやCPUの動作を回路レベルで知ることができた
  • 実際にハードウェアシミュレータ上で、自分が作ったコンピュータがプログラムを実行する過程を見ることができるのは感慨深い

次章はこちら

iikanji.hatenablog.jp