Мне нужно знать, используется ли еще команда ATA Read Sector. Я прочитал в книге SATA Storage Technology, что эта команда и вообще команды чтения PIO используются только в процессе загрузки. Поэтому я начал изучать процесс загрузки, и у меня возникло некоторое замешательство по этому поводу.
Я знаю, что BIOS считывает первый сектор или MBR как часть процесса загрузки. Я также читал, что BIOS использует INT 13 для этого.
Устройство SATA взаимодействует через HBA. Поэтому это чтение первого сектора должно быть после завершения процесса инициализации между SATA и HBA.
Как BIOS считывает первый сектор...
Переводит ли HBA команды INT 13 в ATA?Если да,
Разве для этого не требуется присутствие водителя AHCI?
Когда водитель загружается?
ИЛИ
Взаимодействует ли BIOS напрямую с жестким диском?Я думаю, что это невозможно.
решение1
Для устройств; есть дисковод, SCSI, ATA, ATAPI, USB-накопитель, SATA, NVME и т. д. Большинство из них имеют контроллер (где ЦП может общаться только с контроллером, а контроллер общается с устройством/устройствами, подключенными к контроллеру). Иногда интерфейс, предоставляемый контроллером, относительно стандартизирован (например, AHCI), а иногда нет (SCSI, аппаратные RAID-контроллеры); а иногда контроллер предоставляет несколько интерфейсов (например, контроллер SATA может поддерживать AHCI, а также устаревшую эмуляцию (P)ATA и нестандартный интерфейс RAID; и иметь опции для выбора в настройках BIOS).
Во всех случаях либо в BIOS встроен (минимальный) код драйвера (вероятно, для «относительно стандартизированных» контроллеров/устройств и контроллеров, встроенных в материнскую плату); либо в контроллер встроено «ПЗУ устройства» (например, на той же карте PCI), которое перехватывает «int 0x13».
В любом случае «int 0x13» будет использовать параметр «номер устройства», чтобы выяснить, что это за устройство, и перейти к коду драйвера устройства для этого устройства.
Переводит ли HBA команды INT 13 в ATA?
Если контроллер SATA использует AHCI в качестве интерфейса; тогда драйвер преобразует запросы "int 0x13" в команды SATA/AHCI для HBA. Если контроллер SATA использует устаревшую эмуляцию (P)ATA, тогда драйвер преобразует запросы "int 0x13" в устаревшие команды (P)ATA, тогда HBA преобразует команды ATA в набор команд SATA.
Разве для этого не требуется присутствие водителя AHCI?
Да. Обратите внимание, что это минимальный драйвер (не поддерживающий такие вещи, как "горячее подключение SATA", собственную очередь команд, безопасное стирание, извлечение, обрезка, ...), который использует подход "запустить команду, тратить процессорное время, предотвращая параллелизм и разрушая производительность до завершения команды, затем вернуть статус" для простоты. Это означает, что это совсем не похоже на драйвер устройства, который ОС хотела бы использовать.
Когда водитель загружается?
Код драйвера всегда присутствует где-то в ПЗУ (не загружен с диска в какой-то момент времени). Код драйвера инициализируется либо до того, как прошивка начинает искать "ПЗУ устройств", либо когда прошивка инициализирует "ПЗУ устройств".
После того, как все инициализировано (предполагается, что BIOS загружается с обычного диска, например, не по сети), BIOS может просто использовать «int 0x13» для загрузки первого сектора с «любого устройства, которым оно оказалось после инициализации ПЗУ устройства».
решение2
После некоторого тестирования с помощью анализатора SATA выяснилось, что BIOS или UEFI достаточно умны, чтобы не использовать медленные команды ATA, такие какЧИТАТЬ СЕКТОР(Ы)в процессе загрузки. вместо этого используется команда ATAЧИТАТЬ DMA EXT.
Для полноты последовательность такова:
после того, как диск отправляет свою подпись, HBA отправляет команду ATAИДЕНТИФИКАЦИЯ УСТРОЙСТВА, а затем отправитьЧИТАТЬ DMA EXTс LBA = 0.
Я не уверен, что ОС используетЧИТАТЬ СЕКТОР(Ы)илиНАПИШИТЕ СЕКТОР(Ы)в любом случае при нормальной работе. Надеюсь, что нет, так как реализация протокола PIO IN/OUT в FPGA — не самая приятная работа.