Вопросы о ATA

#kernel #driver #osdev #low-level #ata

Вопрос:

Теперь я хотел внедрить драйверы ATA PIO и ATA DMA (освоение шины PCI). Я прочитал для них вики-страницы OSDev, и после целого дня возни с ними я, наконец, многое понял о дисках ATA, но статьи заставили меня задавать вопросы после прочтения некоторых частей:

1)В разделе ИДЕНТИФИКАЦИЯ рассказывается о том, как ATAPI и SATA прерывают команду ИДЕНТИФИКАЦИИ и заполняют байты идентификации 0x1f4 и 0x1f5, кто-то сказал мне, что это неправильно для дисков SATA, мне нужно разъяснение по этому поводу.

2)Остается ли определение типов дисков на странице PIO таким же, если я хочу использовать вместо этого DMA?

3)В соответствии со страницей osdev ATA DMA:

«Адрес» Главного регистра шины хранится в строке 4, в пространстве конфигурации PCI контроллера диска. Главный регистр шины обычно представляет собой набор из 16 последовательных портов ввода-вывода. Это также может быть 16 — байтовое сопоставленное пространство памяти.

Пожалуйста, если кто-нибудь сможет объяснить этот раздел как можно глубже, а также уточнить его подлинность, я был бы очень рад.

Ответ №1:

1)В разделе ИДЕНТИФИКАЦИЯ рассказывается о том, как ATAPI и SATA прерывают команду ИДЕНТИФИКАЦИИ и заполняют байты идентификации 0x1f4 и 0x1f5, кто-то сказал мне, что это неправильно для дисков SATA, мне нужно разъяснение по этому поводу.

Если это диск SATA, то он должен быть подключен к контроллеру SATA; и:

а) Если контроллер SATA находится в режиме «устаревшей (параллельной) эмуляции контроллера ATA»; тогда все дело в том, что он эмулирует старое оборудование, чтобы старые операционные системы (которые не поддерживают SATA) все еще работали, поэтому вы должны ожидать, что он будет работать так же.

b) Контроллер SATA находится в каком-либо другом режиме (собственный режим, режим RAID) и не эмулирует устаревший (параллельный) контроллер ATA; и ваш устаревший (параллельный) драйвер контроллера ATA вообще не будет работать. Обратите внимание, что (поскольку Windows поддерживает SATA/AHCI более 15 лет) это наиболее вероятный случай для компьютеров, которые все еще используются сегодня.

2)Остается ли определение типов дисков на странице PIO таким же, если я хочу использовать вместо этого DMA?

ДА.

Более конкретно; вы ОПРЕДЕЛЯЕТЕ возможности накопителя и видите, что он поддерживает; и определяете, что поддерживает контроллер диска, что поддерживает кабель (см. Примечание), и знаете, что поддерживает ваш драйвер; а затем ваш драйвер автоматически выбирает самый быстрый вариант, который поддерживается всеми 4 вещами (привод, кабель, контроллер и драйвер). Вы не пытаетесь принять неправильное решение «Я собираюсь использовать режим UDMA 2 независимо от того, что поддерживает оборудование», а затем ожидаете, что оборудование волшебным образом увеличит поддержку вашего решения.

Примечание: еще в 1990-х годах parallel ATA столкнулась с барьером производительности, вызванным перекрестными помехами между проводами в параллельном кабеле; поэтому, чтобы обеспечить более высокую скорость передачи, они модернизировали старый 40-проводный кабель до 80-проводного кабеля (с дополнительным проводом заземления между каждым «использованным» проводом для уменьшения перекрестных помех). Это означает, что привод может сказать, что он поддерживает более быстрые режимы PIO и DMA (и контроллер может их поддерживать); но кабель является старым 40-проводным кабелем, и попытка использовать более быстрые режимы передачи приведет к повреждению данных кабелем. Я не могу вспомнить, как вы определяете тип кабеля (я думаю, что вы проверяете какой-то «смысл», но…).

Пожалуйста, если кто-нибудь сможет объяснить этот раздел как можно глубже, а также уточнить его подлинность, я был бы очень рад.

Регистры «ШТРИХ» в конфигурационном пространстве PCI содержат несколько битов, которые сообщают вам, является ли область отображенным в памяти вводом-выводом (в физическом адресном пространстве) или портами ввода-вывода; и некоторые биты (используемые для «адреса») жестко привязаны к нулю, чтобы вы могли определить размер области (записав 0xFFFFFFFFF в строку и считав его обратно, чтобы определить, сколько битов, где жестко привязано к нулю).

Обратите внимание, что эта информация (какая область памяти/с и какие порты ввода-вывода использует устройство), вероятно, должна быть выполнена с помощью перечисления шин PCI перед запуском любого драйвера PCI. Более конкретно, когда ваш водитель начал что-то должен сказать ему, какие портов ввода-вывода и памяти карты районов, он должен использовать (возможно, после ядра-сказали, чтобы настроить модуль и порт IO разрешение карты позволяет водителю использовать эти территории); и ваш драйвер устройства не должны заботиться, если эта информация поступила из пут конфигурацию пространства или от ISA Plug и Play или с помощью конфигурационного скрипта, или из какого-либо другого типа автобуса (эйса, СМА, …).

также уточните его подлинность…

Большинство вики-страниц OSDev были написаны любителями без предварительного опыта, которые пытались прочитать соответствующие спецификации, возможно, неправильно прочитали/неправильно поняли некоторые вещи и, возможно, вообще не интересовались различными частями спецификации, а затем записали материал, чтобы помочь (возможно, не обновляя его при последующих изменениях оборудования).

Правильный способ использовать эту информацию-прочитать вики-страницы OSD, чтобы немного ознакомиться/упростить чтение спецификаций самостоятельно; затем прочитайте спецификации; затем вернитесь и исправьте все ошибки на вики-страницах. Большинство людей пропускают последнюю часть. Некоторые люди пропускают первую часть.

Не думайте, что вы можете написать драйвер только с вики-страницы/страниц. Они не являются заменой фактическим спецификациям.

Комментарии:

1. Большое спасибо, но я также слышал, что в спецификациях могут быть проблемы, подобные спецификациям atapi. Чувак, самое сложное дерьмо в Osdev-это написание драйверов.