Memphis Блеск ! Код работает (кто-бы сомневался) Получилось читать данные с SATA HDD в блочном PIO32/LBA48 режиме ! Была в коде хитрая манипуляция с установкой сегментного адреса и смещения для буфферирования полученных данных с которой я с ходу не совсем разобрался, и поэтому слегка модифицировал его для исполнения в теле COM-файла. Есть один нюанс: я отлаживаю код непосредственно под MS-DOS не используя при этом эмулятор. Поэтому не смог прогнать программу пошагово.
dess Есть один нюанс: я отлаживаю код непосредственно под MS-DOS не используя при этом эмулятор. - так и я проверяю все в ДОСе (точнее, не все, а то, что связано с портами ХДД/флопа - Виндоза не дает). А зачем эмулятор ? Нужен отладчик, к примеру Debug или AFD. Я использую последний (только из-за его полноэкранности), хоть и с недостатками. Поэтому не смог прогнать программу пошагово - и лишил себя удовольствия проверить корректность фрагмента и поиска ошибок. Была в коде хитрая манипуляция с установкой сегментного адреса и смещения - только так и надо делать - если не будешь пересчитывать, никогда не проведешь трансфер даже одного сектора по начальному адресу, к примеру Seg:0FFF3h (граница сегмента). http://slil.ru/26313688 - а здесь фрагмент кода для записи секторов харда + доработанное чтение (для ознакомления). Что дальше ?
Memphis Огромное спасибо за подробные объяснения ! Думаю на этом остановиться, чтобы собраться мыслями и уделить внимание развитию идеологии самопальной системы. Но в будущем хотелось бы вернуться к данной теме и разобраться в работе с HDD через DMA.
Можно вопрос? Смотрел ваши посты и немного не доганяю. В посте #55 показано, что диапазон портов конроллера САТА совсем не 170 и 1Fh, а везде в примерах почемо-то читают с этих портов. Скажем у меня 2 ИДЕ и 4 САТА Винчестера, как в таком случае мне считать с каждого? Ну для ИДЕ - 1f0-1f7 это понятно. А как использовать те диапазоны контроллера САТА, которые указаны в #55 посте?
Да и еще как можно определить какой диапазон B800 - B807, а какой A400 - A40F? Где это можно получить? В расписаном #46-м посте это невидно
fireman В посте #55 показано, что диапазон портов конроллера САТА совсем не 170 и 1Fh, а везде в примерах почемо-то читают с этих портов. - а я у dess выяснил, куда включен его хард - Primary/Master (раз так, то и манипулирую стандартными адресами, шоб пример можно было реально попробовать/отладить). И при этом мне было до фени, это САТА или ПАТА хард. Все зависит от того, как сконфигурирован БИОС для поддержки харда. Скажем у меня 2 ИДЕ и 4 САТА Винчестера, как в таком случае мне считать с каждого? Ну для ИДЕ - 1f0-1f7 это понятно. А как использовать те диапазоны контроллера САТА, которые указаны в #55 посте? - см. мой пост #56. Там указаны адреса (для dess, естественно, у Вас будут другие. Как определить - читайте выше.) Ну и надо подставить эти адреса в код вместо базовых 1F0h/170h - можно провести трансфер с любого из 6-ти хардов.
fireman Да и еще как можно определить какой диапазон B800 - B807, а какой A400 - A40F? - ну тут надо логику включить. Первый диапазон занимает 8 адресов, значит это точно I/O порты харда. Второй диапазон занимает 16 адресов (один канал БусМастера требует 8 адресов). Контроллер 2-канальный, значит это - адреса БусМастера.
Просто я не пойму как из bus:00, dev:1F, fn:2, class:01018F, irq:0B, 0000B801 0000B401 0000B001 0000A801 0000A401 00000000 Виндовс получил 0000B800-0000B807 И получается для того чтобы прочитать с первого винта на САТА1 я должен читать с 0000B800 а со второго 0000B000 из примера dess
fireman Элементрно Ватсон.Читаешь из регистра сохроняешь значение во временную переменную. Записываешь в этот регист FFFFFFFF и смотришь сколько бит обнулилось. Допустим FFFFFF01 отбрасываем первые 3-4бита(которые определяют формат регистра) FFFFFF00 дальше инвертируем биты (not) 00000FF и прибовляем к тому что сбыло сохронено. Записывам обратно сохроненное значение. Нет. Читай спецификацию PCI. Вообщем вот мои записки можешь почитать раздел PCI http://slil.ru/26345982 раздел про жесткие нужно переписывать все руки не дойдут. Уже ближе к правде. На одном контроллере SATA может быть как 2 так и 4 винчестера. Зависит от контроллера.
Pavia Спасибо за документ! изучил все, есть один вопрос у ИДЕ 1F0-1F7 и 3F4+2=3F6 а у Сата также B800 - B807 B400 + 2 Использовать или как-то по другому?
Pavia Читаешь из регистра сохроняешь значение во временную переменную... - не понял твою методу. А если в PCI-регистр уже занесено значение FFFFFFF0h (ну не БИОС, так я ручками установил/назначил неконфликтный адрес) - разве эта метода сработает ? Я думаю, Виндоза определяет диапазоны адресов, манипулируя адресами портов (запись/чтение/анализ).
Еще вопрос - как определить максимальное время ожидания после команды 0x20, когда однозначно можно сказать что что-то идет не так. Прерывания запрещены. Во всех исходниках которые смотрел таймаут захардкоден константой, причем от милисекунд до секунды.
Rodin Разумеется, да. Конечно, не в 2 раза и даже не в полтора. Но процентов 10...15 выигрыш можно получить. Если-бы овчинка выделки не стОила, зачем вендорам хардов вводить новые АТА-команды и писать фирмварь под них? Но с приходом УДМА это все уже в прошлом (хотя Хрюша любит сбить моду харду до ПИО, а возвратить - нет). Т.е. ПИО живет и здравствует. Более того, чтение паспорта харда, всякие секьюрети-команды, DCO и прочее работают только в ПИО.
Rodin как определить максимальное время ожидания после команды 0x20 - на грамотный вопрос такой-же ответ. В моих фрагментах есть 2 существенных момента - время ожидания готовности харда и время ожидания исполнения команды. Видно, что у меня это время уходит в бесконечность. На самом деле время ожидания - не более 31 сек. Это надо для гарантированной раскрутки харда после подачи питания или выхода его из Standby. Мне просто лень было это писать, но ушлый юзер подвох в зацикливании сразу заметит. Если уж сильно интересует - могу дописать (буду опрашивать в цикле порт харда и порт таймера).