disk controller 21日目から
- 0から作るOS開発
- Wiki OS Project "ATA/ATAPI"
- Wiki OS Dev "PCI IDE Controller"
- SEAGATE ATA reference
- カーネルをブートするまで
- How to write on hard disk with bios interrupt 13h
- programming_ata_atapi
- HDDの話
- How do I configure an ATA hard disk to start generating interrupts?
- ATA/ATAPI Identify
- 参考github
- 512byteの倍数分メモリが確保されている前提で動く。確保してない場合の動作は保証しない
- hariboteではintサイズ4byte,shortサイズ2byte
- device番号は 0 のみ想定
- ATAPIだった時の動作は保証しない
- Read/WriteでINTRQの発生タイミングは異なる SEAGATE ATA reference
- INTRQの総数と読み書きしたセクタ数は同じ値 (MULTIMODEは別)
セクタ数が増えるにつれ、INTRQ増加。
- ide_ata_read_sector_pio(device, LBA, 読み込むセクタの数, メモリの先頭アドレス)
- ide_ata_write_sector_pio(device, LBA, 書き込むセクタの数, メモリの先頭アドレス)
Set Multipleコマンドで何セクタごとにINTRQを発生させるか設定したのち、
読み書き実行。ただし、設定したセクタ数とちょうどのセクタを読み書きした場合は
コマンド実行完了時の割り込みのみが発生する。(設定したセクタ数以下の読み書きでは特別な割り込みなし)
- int ide_set_multimode(int device, int sec_cnt)
- ide_ata_read_multiple_sector_pio(device, LBA, 読み込むセクタの数, メモリの先頭アドレス)
- ide_ata_write_multiple_sector_pio(device, LBA, 書き込むセクタの数, メモリの先頭アドレス)
- writeに関しては、vdiファイルをhexdumpで確認できる。
- readとかのテストはbootpack.cに記述してる。