Я согласен с @joev, что, вероятно, проще всего использовать вызовы BIOS, но если вы хотите развернуть свой собственный, похоже, вы захотите получить доступ к аппаратному обеспечению напрямую.
ДляКонтроллер PATA (или SATA, установленный в режим совместимости), вы можете использовать PIO для простого доступа к данным.В вики OS Dev есть большая статья об этом здесь: http://wiki.osdev.org/ATA_PIO_Mode
Вы можете получить доступ к контроллерам через устаревшие порты ввода / вывода 0x1f0-0x1f7 (основной) и 0x170-0x177 (дополнительный).Следующий пример чтения взят со страницы вики:
- Отправьте 0xE0 для «ведущего» или 0xF0 для «ведомого», ORed с старшими 4 битами LBA на порт 0x1F6:outb (0x1F6, 0xE0 | (slavebit << 4) | ((LBA >> 24) & 0x0F))
- Отправьте нулевой байт на порт 0x1F1, если хотите (он игнорируется и тратит много ресурсов ЦПвремя): outb (0x1F1, 0x00)
- Отправка счетчика секторов на порт 0x1F2: outb (0x1F2, (беззнаковый символ))
- Отправка младших 8 бит LBA на порт 0x1F3:outb (0x1F3, (без знака) LBA))
- Отправьте следующие 8 бит LBA на порт 0x1F4: outb (0x1F4, (без знака) (LBA >> 8))
- Отправьте следующие 8 бит LBA на порт 0x1F5: outb (0x1F5, (unsigned char) (LBA >> 16))
- Отправьте команду «READ SECTORS» (0x20) на порт 0x1F7: outb (0x1F7, 0x20)
- Ожидание IRQ или опроса.
- Передача 256 слов, слово за раз, в ваш буфер из порта ввода-вывода 0x1F0.(В ассемблере REP INSW хорошо работает для этого.)
- Затем вернитесь к ожиданию следующего IRQ (или повторите опрос - см. Следующую заметку) для каждого последующего сектора.
Существуют также более сложные способы доступа к накопителям (MMIO, более сложные режимы PIO, режимы DMA и т. Д.), Но это определенно хорошая отправная точка.