第二部突入。x86系PCのアーキテクチャの理解めも
#コンピュータの基礎構成
##BIOS(Basic Input/Output System)
基本入出力ソフトウェア群。電源投入時に外部記憶装置からメモリに、起動プログラムをロードする。メモリのROMにある。つまり、「一番最初に起動するプログラム」とはBIOSである。基本的な流れは↓
起動
↓
POST(Power on Self Test):最低限のHW Check
↓(ここで周辺機器エラーか特定キー押下で再起動電断待ちへ)
512バイト読み込み:0x7C00番地にロード
↓(ブートコードでなければ再起動電断待ちへ)
末尾2バイトを確認し、ブートコードを起動
0x7C00番地(必ずこの番地)にロードされたUserが作成可能な最初のプログラムをブートコードと呼ぶ。
徐々にOSなどのプログラム全体をロードしていく(ブートストラップ)
##入出力装置(ポート)の役割
CPUと外部入出力装置との電気的な接点。
キーボードの操作の場合、キーボードとCPUの間にはキーボード制御に特化したキーボードコントローラKBCが介される。これがCPUのポートと接続する。KBCはキーボードごとの差異を吸収する。
キーが押されるとKBCの出力ポートが変化するが、CPUがそのキーを検知する待機時間がめっちゃ長くて無駄。そのため、KBCはCPUに対して割り込みをかけることができる。
##割り込みコントローラ
そもそも割り込みとは?・・・プログラムの実行アドレスを特定の値に書き換えること。ここで第一部で出てきた割り込みベクタテーブル。こいつに書き換える値が格納されてる。
割り込みベクタテーブルにアドレスを設定しておくと、ほかのプログラムから割り込み番号だけで処理を依頼できる。
また、様々な機器から来る割り込み情報はいったん割り込みコントローラに接続され、優先順位付けされる。
#CPUの基本機能
16ビットの8086について、まずは理解する。
##8086のレジスタ
・汎用レジスタ:一般的な算術演算等で使用可能なレジスタ。AXは乗除計算、ポート入出力命令でのデータ格納。BXはポインタレジスタ。CXは繰り返し時のカウンタレジスタ。DXはAXと同様。これらは16ビットだが、上位下位を8bitに分割して利用可。
・フラグレジスタ:制御フラグと状態フラグに大別される。詳細は表参照
・セグメントレジスタ:ポインタレジスタが示すアドレスの開始位置を示すためにあるもの。
ポインタレジスタ:CPUがアドレスを指定するときに使用する
#80386では
汎用レジスタが32ビットになり、また、「セグメント」の意味が、保護されたメモリ空間に変化した(8086はポインタレジスタでアクセス可能な分割されたメモリ空間の意味だった)。(その他は略)
#外部インターフェース
メモリとのデータのやり取りは、データバス幅32ビットを考慮したデータ保存アドレスを調整する必要がある(データアラインメント)。つまり4バイト境界でデータを配置するといいということ。
##エンディアン
x86系CPUではリトルエンディアン方式でデータが記憶される。同じアドレスに異なるデータサイズでアクセスする場合、潜在的な問題として認識しておく必要がる。
##ポート
入出力ポートで外部周辺機器へ「データ<=>電気信号」の界面を提供する。4ビット入出力の周辺機器内部に対してCPUは8ビットの入出力を行うが、PIOの中のレジスタが入力用、出力用に分けられているため、CPUと周辺機器双方の通信が可能になる。(CPU<=(8ビット通信)=>PIO<=(4ビット通信)=>周辺機器)