Доступ к жесткому диску с помощью сборки - PullRequest
2 голосов
/ 11 декабря 2011

Где я могу узнать, как обращаться к жесткому диску непосредственно из сборки (при условии, что я работаю в реальном режиме или звонит 0). Например, я хочу загрузить данные из секторов 100-200 в какое-то место в оперативной памяти. Как мне обратиться к конкретному жесткому диску и как сообщить диску, какие сектора мне нужны?

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Я согласен с @joev, что, вероятно, проще всего использовать вызовы BIOS, но если вы хотите развернуть свой собственный, похоже, вы захотите получить доступ к аппаратному обеспечению напрямую.

ДляКонтроллер PATA (или SATA, установленный в режим совместимости), вы можете использовать PIO для простого доступа к данным.В вики OS Dev есть большая статья об этом здесь: http://wiki.osdev.org/ATA_PIO_Mode

Вы можете получить доступ к контроллерам через устаревшие порты ввода / вывода 0x1f0-0x1f7 (основной) и 0x170-0x177 (дополнительный).Следующий пример чтения взят со страницы вики:

  1. Отправьте 0xE0 для «ведущего» или 0xF0 для «ведомого», ORed с старшими 4 битами LBA на порт 0x1F6:outb (0x1F6, 0xE0 | (slavebit << 4) | ((LBA >> 24) & 0x0F))
  2. Отправьте нулевой байт на порт 0x1F1, если хотите (он игнорируется и тратит много ресурсов ЦПвремя): outb (0x1F1, 0x00)
  3. Отправка счетчика секторов на порт 0x1F2: outb (0x1F2, (беззнаковый символ))
  4. Отправка младших 8 бит LBA на порт 0x1F3:outb (0x1F3, (без знака) LBA))
  5. Отправьте следующие 8 бит LBA на порт 0x1F4: outb (0x1F4, (без знака) (LBA >> 8))
  6. Отправьте следующие 8 бит LBA на порт 0x1F5: outb (0x1F5, (unsigned char) (LBA >> 16))
  7. Отправьте команду «READ SECTORS» (0x20) на порт 0x1F7: outb (0x1F7, 0x20)
  8. Ожидание IRQ или опроса.
  9. Передача 256 слов, слово за раз, в ваш буфер из порта ввода-вывода 0x1F0.(В ассемблере REP INSW хорошо работает для этого.)
  10. Затем вернитесь к ожиданию следующего IRQ (или повторите опрос - см. Следующую заметку) для каждого последующего сектора.

Существуют также более сложные способы доступа к накопителям (MMIO, более сложные режимы PIO, режимы DMA и т. Д.), Но это определенно хорошая отправная точка.

2 голосов
/ 11 декабря 2011

То, как вы это делали, когда динозавры бродили по земле, состояло в том, чтобы использовать вызов BIOS «INT 13H» с AH, установленным на 02H.Это может даже не работать на современных ПК в эпоху SATA.

Подробнее здесь .Вы, вероятно, получите лучший ответ, если предоставите более подробную информацию в своем вопросе (например, используете ли вы какую-то ОС или это какой-то проект «накатить свой»?)

...