C言語で0から作るOSを開発について説明していきます。このシリーズではカーネルの開発について説明しています。
今回は基本的なディスクであるフロッピーディスクからファイルのデータを読み込むドライバーについて説明していきます。
[目次]
前回までの内容
フロッピーディスクの歴史
8インチフロッピーディスク
読み書き可能なフロッピーディスク
5.25インチフロッピーディスク
3.5インチフロッピーディスク
フロッピーディスクの構造
フロッピードライブ
3.5インチフロッピーディスクの構造
フロッピーディスクの物理フォーマット
シリンダー(トラック)/ヘッド/セクター(CHS:Cylinder/Head/Sector)
シリンダー(トラック)
ヘッド
セクター
LBA(Linear Block Addressing)
フロッピーディスクコントローラー
8272Aフロッピーディスクコントローラー
フロッピーディスクドライブの接続
フロッピーディスクコントローラーのポートアドレス
フロッピーディスクコントローラーのポートアドレス定義
フロッピーディスクコントローラーのレジスター
ステータスレジスターA(SRA:Status Register A)(PS/2モードのみ)
ステータスレジスターB(SRA:Status Register B)(PS/2モードのみ)
データレートセレクトレジスター(DSR:Data Rate Select Register)
デジタルアウトプットレジスター(DOR:Digital Output Register)
デジタルアウトプットレジスターDORの実装
メインステータスレジスター(MSR:Main Status Register)
メインステータスレジスターMSRの実装
テープドライブレジスターTDR
データレジスター
データレジスターの実装
デジタルインプットレジスターDIR
制御設定レジスター(CCR:Configuration Control Register)
フロッピーディスクの制御コマンド概要
フロッピーディスクコントローラの制御コマンド一覧
フロッピーディスクコントローラーの制御コマンドを定義する
フロッピーディスクコントローラーの制御コマンドの拡張ビット
拡張ビットを定義する
ギャップ3サイズ(GPL:Gap3 Length)
ギャップ3サイズを定義する
セクターサイズ
セクターサイズを定義する
フロッピーディスクコントローラーの制御コマンドの書き込み
制御コマンドのステータス読み込み
ステータスレジスターST0
ステータスレジスターST1
ステータスレジスターST2
ステータスレジスターST3
フロッピーディスクコントローラーの制御コマンド詳細
READ TRACK(0x02)
READ TRACKコマンド
READ TRACKコマンドステータス
SPECIFY(0x03)
SPECIFYコマンド
ステップレートSRT(Step Rate)
ヘッドアンロードタイムHUT(Head Unload Time)
ヘッドロードタイムHUT(Head Load Time)
NDMビット(Non-DMAビット)
SPECIFYコマンドステータス
SPECIFYコマンドの実装
SENSE DRIVE STATUS(0x04)
SENSE DRIVE STATUSコマンド
SENSE DRIVE STATUSコマンドステータス
WRITE DATA(0x05)
WRITE DATAコマンド
WRITE DATAコマンドステータス
READ DATA(0x06)
READ DATAコマンド
READ DATAコマンドステータス
READ DATAコマンドの実装
RECALIBRATE(0x07)
RECALIBRATEコマンド
RECALIBRATEコマンドステータス
RECALIBRATEコマンドの実装
SENSE INTERRUPT STATUS(0x08)
SENSE INTERRUPT STATUSコマンド
SENSE INTERRUPT STATUSコマンドステータス
SENSE INTERRUPT STATUSコマンドの実装
WRITE DELETED DATA(0x09)
WRITE DELETED DATAコマンド
WRITE DELETED DATAコマンドステータス
READ ID(0x0A)
READ IDコマンド
READ IDコマンドステータス
READ DELETED DATA(0x0C)
SKビットとREAD DELETED DATAコマンドのステータスとの関係
READ DELETED DATAコマンド
READ DELETED DATAコマンドステータス
FORMAT TRACK(0x0D)
参考 フォーマット時の標準値
FORMAT TRACKコマンド
FORMAT TRACKコマンドステータス
DUMPREG(0x0E)
DUMPREGコマンド
DUMPREGコマンドステータス
SEEK(0x0F)
SEEKコマンド
SEEKコマンドステータス
SEEKコマンドの実装
VERSION(0x10)
VERSIONコマンド
VERSIONコマンドステータス
SCAN EQUAL(0x11)
SCAN EQUALコマンド
STP
SCAN EQUALコマンドステータス
PERPENDICULAR MODE(0x12)
PERPENDICULAR MODEコマンド
OWビット
PERPENDICULAR MODEコマンドステータス
CONFIGURE(0x13)
CONFIGUREコマンド
CONFIGUREコマンドのパラメーターの各ビットについて
CONFIGUREコマンドステータス
LOCK(0x14)
LOCKコマンド
LOCKコマンドステータス
VERIFY(0x16)
VERIFYコマンド
ECビット
VERIFYコマンドステータス
SCAN LOW OR EQUAL(0x19)
SCAN LOW OR EQUALコマンド
SCAN LOW OR EQUALコマンドステータス
SCAN HIGH OR EQUAL(0x1D)
SCAN HIGH OR EQUALコマンド
SCAN HIGH OR EQUALコマンドステータス
RELATIVE SEEK(0x8F)
RELATIVE SEEKコマンド
DIRビット
RELATIVE SEEKコマンドステータス
フロッピードライブの制御まとめ
フロッピードライブの初期化
コントローラーのリセット
コントローラーの有効化
コントローラーの初期化
初期化フロー
初期化実装
ディスクの読み込み/書き込み
読み込み/書き込みフロー
LBAとCHS
LBAを使用したセクター読み込み
ディスクのフォーマット
フロッピードライブの割り込みハンドラー
PICの設定
フロッピードライブのIDTを設定する
今回は基本的なディスクであるフロッピーディスクからファイルのデータを読み込むドライバーについて説明していきます。
[目次]
前回までの内容
フロッピーディスクの歴史
8インチフロッピーディスク
読み書き可能なフロッピーディスク
5.25インチフロッピーディスク
3.5インチフロッピーディスク
フロッピーディスクの構造
フロッピードライブ
3.5インチフロッピーディスクの構造
フロッピーディスクの物理フォーマット
シリンダー(トラック)/ヘッド/セクター(CHS:Cylinder/Head/Sector)
シリンダー(トラック)
ヘッド
セクター
LBA(Linear Block Addressing)
フロッピーディスクコントローラー
8272Aフロッピーディスクコントローラー
フロッピーディスクドライブの接続
フロッピーディスクコントローラーのポートアドレス
フロッピーディスクコントローラーのポートアドレス定義
フロッピーディスクコントローラーのレジスター
ステータスレジスターA(SRA:Status Register A)(PS/2モードのみ)
ステータスレジスターB(SRA:Status Register B)(PS/2モードのみ)
データレートセレクトレジスター(DSR:Data Rate Select Register)
デジタルアウトプットレジスター(DOR:Digital Output Register)
デジタルアウトプットレジスターDORの実装
メインステータスレジスター(MSR:Main Status Register)
メインステータスレジスターMSRの実装
テープドライブレジスターTDR
データレジスター
データレジスターの実装
デジタルインプットレジスターDIR
制御設定レジスター(CCR:Configuration Control Register)
フロッピーディスクの制御コマンド概要
フロッピーディスクコントローラの制御コマンド一覧
フロッピーディスクコントローラーの制御コマンドを定義する
フロッピーディスクコントローラーの制御コマンドの拡張ビット
拡張ビットを定義する
ギャップ3サイズ(GPL:Gap3 Length)
ギャップ3サイズを定義する
セクターサイズ
セクターサイズを定義する
フロッピーディスクコントローラーの制御コマンドの書き込み
制御コマンドのステータス読み込み
ステータスレジスターST0
ステータスレジスターST1
ステータスレジスターST2
ステータスレジスターST3
フロッピーディスクコントローラーの制御コマンド詳細
READ TRACK(0x02)
READ TRACKコマンド
READ TRACKコマンドステータス
SPECIFY(0x03)
SPECIFYコマンド
ステップレートSRT(Step Rate)
ヘッドアンロードタイムHUT(Head Unload Time)
ヘッドロードタイムHUT(Head Load Time)
NDMビット(Non-DMAビット)
SPECIFYコマンドステータス
SPECIFYコマンドの実装
SENSE DRIVE STATUS(0x04)
SENSE DRIVE STATUSコマンド
SENSE DRIVE STATUSコマンドステータス
WRITE DATA(0x05)
WRITE DATAコマンド
WRITE DATAコマンドステータス
READ DATA(0x06)
READ DATAコマンド
READ DATAコマンドステータス
READ DATAコマンドの実装
RECALIBRATE(0x07)
RECALIBRATEコマンド
RECALIBRATEコマンドステータス
RECALIBRATEコマンドの実装
SENSE INTERRUPT STATUS(0x08)
SENSE INTERRUPT STATUSコマンド
SENSE INTERRUPT STATUSコマンドステータス
SENSE INTERRUPT STATUSコマンドの実装
WRITE DELETED DATA(0x09)
WRITE DELETED DATAコマンド
WRITE DELETED DATAコマンドステータス
READ ID(0x0A)
READ IDコマンド
READ IDコマンドステータス
READ DELETED DATA(0x0C)
SKビットとREAD DELETED DATAコマンドのステータスとの関係
READ DELETED DATAコマンド
READ DELETED DATAコマンドステータス
FORMAT TRACK(0x0D)
参考 フォーマット時の標準値
FORMAT TRACKコマンド
FORMAT TRACKコマンドステータス
DUMPREG(0x0E)
DUMPREGコマンド
DUMPREGコマンドステータス
SEEK(0x0F)
SEEKコマンド
SEEKコマンドステータス
SEEKコマンドの実装
VERSION(0x10)
VERSIONコマンド
VERSIONコマンドステータス
SCAN EQUAL(0x11)
SCAN EQUALコマンド
STP
SCAN EQUALコマンドステータス
PERPENDICULAR MODE(0x12)
PERPENDICULAR MODEコマンド
OWビット
PERPENDICULAR MODEコマンドステータス
CONFIGURE(0x13)
CONFIGUREコマンド
CONFIGUREコマンドのパラメーターの各ビットについて
CONFIGUREコマンドステータス
LOCK(0x14)
LOCKコマンド
LOCKコマンドステータス
VERIFY(0x16)
VERIFYコマンド
ECビット
VERIFYコマンドステータス
SCAN LOW OR EQUAL(0x19)
SCAN LOW OR EQUALコマンド
SCAN LOW OR EQUALコマンドステータス
SCAN HIGH OR EQUAL(0x1D)
SCAN HIGH OR EQUALコマンド
SCAN HIGH OR EQUALコマンドステータス
RELATIVE SEEK(0x8F)
RELATIVE SEEKコマンド
DIRビット
RELATIVE SEEKコマンドステータス
フロッピードライブの制御まとめ
フロッピードライブの初期化
コントローラーのリセット
コントローラーの有効化
コントローラーの初期化
初期化フロー
初期化実装
ディスクの読み込み/書き込み
読み込み/書き込みフロー
LBAとCHS
LBAを使用したセクター読み込み
ディスクのフォーマット
フロッピードライブの割り込みハンドラー
PICの設定
フロッピードライブのIDTを設定する