Чтение секторов SATA HDD

Тема в разделе "WASM.ASSEMBLER", создана пользователем dess, 14 окт 2008.

  1. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Memphis
    Блеск ! Код работает (кто-бы сомневался) :) Получилось читать данные с SATA HDD в блочном PIO32/LBA48 режиме ! Была в коде хитрая манипуляция с установкой сегментного адреса и смещения для буфферирования полученных данных с которой я с ходу не совсем разобрался, и поэтому слегка модифицировал его для исполнения в теле COM-файла. Есть один нюанс: я отлаживаю код непосредственно под MS-DOS не используя при этом эмулятор. Поэтому не смог прогнать программу пошагово.
     
  2. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    dess
    Есть один нюанс: я отлаживаю код непосредственно под MS-DOS не используя при этом эмулятор. - так и я проверяю все в ДОСе (точнее, не все, а то, что связано с портами ХДД/флопа - Виндоза не дает). А зачем эмулятор ? Нужен отладчик, к примеру Debug или AFD. Я использую последний (только из-за его полноэкранности), хоть и с недостатками.

    Поэтому не смог прогнать программу пошагово - и лишил себя удовольствия проверить корректность фрагмента и поиска ошибок.

    Была в коде хитрая манипуляция с установкой сегментного адреса и смещения - только так и надо делать - если не будешь пересчитывать, никогда не проведешь трансфер даже одного сектора по начальному адресу, к примеру Seg:0FFF3h (граница сегмента).

    http://slil.ru/26313688 - а здесь фрагмент кода для записи секторов харда + доработанное чтение (для ознакомления). Что дальше ?
     
  3. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Memphis
    Огромное спасибо за подробные объяснения ! Думаю на этом остановиться, чтобы собраться мыслями и уделить внимание развитию идеологии самопальной системы. Но в будущем хотелось бы вернуться к данной теме и разобраться в работе с HDD через DMA.
     
  4. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    Можно вопрос?
    Смотрел ваши посты и немного не доганяю.
    В посте #55 показано, что диапазон портов конроллера САТА совсем не 170 и 1Fh, а везде в примерах почемо-то читают с этих портов.
    Скажем у меня 2 ИДЕ и 4 САТА Винчестера, как в таком случае мне считать с каждого?
    Ну для ИДЕ - 1f0-1f7 это понятно.
    А как использовать те диапазоны контроллера САТА, которые указаны в #55 посте?
     
  5. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    Да и еще как можно определить какой диапазон B800 - B807, а какой A400 - A40F?
    Где это можно получить? В расписаном #46-м посте это невидно :dntknw:
     
  6. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    fireman
    В посте #55 показано, что диапазон портов конроллера САТА совсем не 170 и 1Fh, а везде в примерах почемо-то читают с этих портов. - а я у dess выяснил, куда включен его хард - Primary/Master (раз так, то и манипулирую стандартными адресами, шоб пример можно было реально попробовать/отладить). И при этом мне было до фени, это САТА или ПАТА хард. Все зависит от того, как сконфигурирован БИОС для поддержки харда.

    Скажем у меня 2 ИДЕ и 4 САТА Винчестера, как в таком случае мне считать с каждого?
    Ну для ИДЕ - 1f0-1f7 это понятно.
    А как использовать те диапазоны контроллера САТА, которые указаны в #55 посте?
    - см. мой пост #56. Там указаны адреса (для dess, естественно, у Вас будут другие. Как определить - читайте выше.) Ну и надо подставить эти адреса в код вместо базовых 1F0h/170h - можно провести трансфер с любого из 6-ти хардов.
     
  7. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    fireman
    Да и еще как можно определить какой диапазон B800 - B807, а какой A400 - A40F? - ну тут надо логику включить. Первый диапазон занимает 8 адресов, значит это точно I/O порты харда. Второй диапазон занимает 16 адресов (один канал БусМастера требует 8 адресов). Контроллер 2-канальный, значит это - адреса БусМастера.
     
  8. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    Просто я не пойму как из
    bus:00, dev:1F, fn:2, class:01018F, irq:0B, 0000B801 0000B401 0000B001 0000A801 0000A401 00000000
    Виндовс получил
    0000B800-0000B807
    И получается для того чтобы прочитать с первого винта на САТА1 я должен читать с
    0000B800 а со второго 0000B000 из примера dess
     
  9. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    И Как я понял необходимо уменьшать информацию от ПЦИ на еденицу чтобы получить адрес порта?!
     
  10. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    Раскажеш как? :)
     
  11. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    Я так понимаю, что В800 это адрес портов для САТА1 и САТА2, а В000 - для САТА3 и САТА4?
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    fireman
    Элементрно Ватсон.Читаешь из регистра сохроняешь значение во временную переменную. Записываешь в этот регист FFFFFFFF и смотришь сколько бит обнулилось. Допустим FFFFFF01 отбрасываем первые 3-4бита(которые определяют формат регистра) FFFFFF00 дальше инвертируем биты (not) 00000FF и прибовляем к тому что сбыло сохронено. Записывам обратно сохроненное значение.

    Нет. Читай спецификацию PCI. Вообщем вот мои записки можешь почитать раздел PCI http://slil.ru/26345982 раздел про жесткие нужно переписывать все руки не дойдут.


    Уже ближе к правде. На одном контроллере SATA может быть как 2 так и 4 винчестера. Зависит от контроллера.
     
  13. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    Pavia
    Спасибо за документ!
    изучил все, есть один вопрос
    у ИДЕ 1F0-1F7 и 3F4+2=3F6 а у Сата также B800 - B807
    B400 + 2 Использовать или как-то по другому?
     
  14. fireman

    fireman New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2008
    Сообщения:
    39
    Вопрос снимаю, нашел выше :)
    После ночной смены немного проц тормозит :)
    Спасибо всем за ответы
     
  15. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Pavia
    Читаешь из регистра сохроняешь значение во временную переменную... - не понял твою методу. А если в PCI-регистр уже занесено значение FFFFFFF0h (ну не БИОС, так я ручками установил/назначил неконфликтный адрес) - разве эта метода сработает ? Я думаю, Виндоза определяет диапазоны адресов, манипулируя адресами портов (запись/чтение/анализ).
     
  16. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Будет ли сколь-нибудь существенный прирост скорости при переходе от посекторного чтения к блочному?
     
  17. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Еще вопрос - как определить максимальное время ожидания после команды 0x20, когда однозначно можно сказать что что-то идет не так. Прерывания запрещены. Во всех исходниках которые смотрел таймаут захардкоден константой, причем от милисекунд до секунды.
     
  18. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Rodin
    Разумеется, да. Конечно, не в 2 раза и даже не в полтора. Но процентов 10...15 выигрыш можно получить. Если-бы овчинка выделки не стОила, зачем вендорам хардов вводить новые АТА-команды и писать фирмварь под них? Но с приходом УДМА это все уже в прошлом (хотя Хрюша любит сбить моду харду до ПИО, а возвратить - нет). Т.е. ПИО живет и здравствует. Более того, чтение паспорта харда, всякие секьюрети-команды, DCO и прочее работают только в ПИО.
     
  19. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Rodin
    как определить максимальное время ожидания после команды 0x20 - на грамотный вопрос такой-же ответ. В моих фрагментах есть 2 существенных момента - время ожидания готовности харда и время ожидания исполнения команды. Видно, что у меня это время уходит в бесконечность. На самом деле время ожидания - не более 31 сек. Это надо для гарантированной раскрутки харда после подачи питания или выхода его из Standby. Мне просто лень было это писать, но ушлый юзер подвох в зацикливании сразу заметит. Если уж сильно интересует - могу дописать (буду опрашивать в цикле порт харда и порт таймера).
     
  20. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Работая под виндой я морально не готов залочить все на 31 сек