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

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

  1. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Pavia
    YESSS !!! Получилось ! Да, действительно, проблема была в неправильной проверке битов статуса. После посыла команды я ожидал её выполнения проверяя BSY=0 и DRDY=0, а потом ожидал готовность данных проверяя DRQ=1. В этом и был подвох. На самом деле после посыла команды нужно ожидать готовность данных проверяя BSY=0 и DRQ=1. И всё заработало !!! Сектор прочитан ! И в родном режиме и в устаревшем. ВСЕМ АГРОМНАЕ СПАСИБА !!! Теперь буду разбираться с FAT32 и с поиском заданного файла. :)))
     
  2. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Pavia
    Да, видимо у ATA и SATA действительно немного разные поведения, поскольку прекрасно работавшая на ATA проверка статуса, для SATA оказалась некорректной.
     
  3. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Возник новый вопрос ! SATA поддерживает LBA48 адресацию. Вопрос в том, как этой возможностью воспользоваться. Wiki гласит: "...Резонный вопрос: как работать с LBA48, если все регистры имеют разрядность 8 бит? При адресации через LBA48 запись адреса идет в те же регистры, но более хитрым способом. Сначала записывается старшая часть адреса и число секторов, а затем (во второй раз) в те же самые регистры записывается младшая часть...". Тоесть, как я понял, никаким особым образом режим LBA48 включать ненадо, просто нужно адрес записать дважды подряд ? Тоесть последовательно пишем значения в порты: BasePort...+1,+2,+3,+4,+5,+3,+4,+5,+команда, и контроллер адресуется по LBA48 ???
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    dess
    Включать не нужно. Для LBA48 используются свои команды. Нужно только проверить поддержку (тут эмуляторы выдают ложную информацию).
    Тоесть последовательно пишем значения в порты: BasePort...+2,+3,+4,+5,+2,+3,+4,+5,+7(команда)
    Sector Count тоже подрос и стал 16битным
    +1 это Features он зарезервирован, незачем в него писать.
     
  5. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Pavia
    Отлично, спасибо ! Сейчас проверю. А - "Для LBA48 используются свои команды" - означает, что для чтения сектора используется не 020h код, а какой-то другой ?
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Да.
    А с www.t13.org спецификацию скачать не судьба?
    Там всё есть, включая LBA48.
     
  7. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    cppasm
    Во, вещь ! Благодарю за ссылочку ! Покапаюсь...
     
  8. Rodin

    Rodin New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2007
    Сообщения:
    125
    Возникнут ли проблемы, если читать/писать на ATA диск через порты из под винды?
    Например я что-нить занес в порты, но команды не произвел. Тут меня прервал драйвер диска, выполняя запрос какого-нить потока, перезатер мои данные, выполнил свою команду. Вернул мне управление, я выполняю свою команду и получаю непредсказуемые результаты.

    Возможно стоит работать с портами только из кернела и с предварительно поднятым приоритетом? Но тогда до какого IRQL?
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Rodin
    Теоретически возможно, но вероятность мола.

    Да работать из кернела. А приоритеты тут причем? Это жадность? Совет почитать про то, как работает планировщик процессов и для чего нужны приоритеты.
     
  10. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    1. Через порты I/O, естественно. У стандартного ИДЕ свои адреса, у внешних контроллеров - свои.
    2. Читать в каком режиме - ПИО или УДМА. Для каждого режима свои команды.
    3. Читать в режиме ЛБА28/ЛБА48/ЦХС - опять свои АТА-команды.

    Сначала определитесь и формулируйте конкретно.
     
  11. Rodin

    Rodin New Member

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

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Memphis
    ... Контроллер встроенный на материнской плате, поддерживает работу в родном и устаревшем режимах (не имеет значения), чтение сектора происходит в режиме PIO, LBA48.
     
  13. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Я ж и допытываюсь - куда включен хард (Primary/Secondary/Master/Slave) ?
    Вот ниже пример чтения одного сектора (МБР, нулевой ЛБА) для Secondary/Slave в режиме ЛБА28/ПИО по адресу ОЗУ 6000h:1000h:

    mov al,0
    mov dx,171h
    out dx,al

    inc ax
    inc dx
    out dx,al

    dec ax
    inc dx
    out dx,al

    inc dx
    out dx,al

    inc dx
    out dx,al

    mov al,0F0h
    inc dx
    out dx,al

    mov al,20h
    inc dx
    out dx,al

    lab0:

    in al,dx

    test al,80h
    jnz lab0

    cmp al,58h
    jnz error

    mov cx,100h
    push 6000h
    pop es
    mov di,1000h
    cld
    sub dx,7
    rep insw
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Memphis
    Таже ошибка что и у dess. Прочитай посты #20 и #21.
    Контроллер может снять BSY до того как сможет передать данные DRQ. Это позволяет в такии промяжутки отпровлять следующую команду, чем можно ускорить работу контроллера. Таким оброзом можно спаривать только определенные команды.

    Нужно проверять еще и 3 бит DRQ
     
  15. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Pavia
    На самом деле после посыла команды нужно ожидать готовность данных проверяя BSY=0 и DRQ=1. - это из 21-го поста.

    А вот у меня -
    test al,80h
    jnz lab0

    cmp al,58h
    jnz error

    то шо, слепой, брат ?

    А твой пост №20 к первоначальной постановке задачи (теме) вообще не имеет отношения.
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Memphis
    Я то не слепой. Только у тебя тут логика ломается. У тебя если
    BSY=0 и DRQ=1 перейдет к ошибке.

    Еще раз повторяю BSY и DRQ устанавливаются не одновременно.
    Какраз таки имеет. У SATA эта особенность выплывает на ружу. У ATA это не так заметно.
     
  17. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Memphis
    В БИОСе в режиме Compatible Mode хард видится как Primary IDE Master, а в режиме Enhanced Mode вообще как Third IDE Master...
     
  18. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Memphis
    Я неделю безрезультатно парился с проверкой бит статуса на SATA используя код от ATA. И вот, что получается: на SATA после посыла команды чтения сектора достаточно ожидать данных от HDD (DRQ=1) и освобождения канала (BSY=0), после чего можно просто забрать считанные данные.
     
  19. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Pavia
    У тебя если
    BSY=0 и DRQ=1 перейдет к ошибке.
    - ошибаешься, перейдет, к примеру с кодом 59 (что, никогда не видел такого ?) И не ломается логика. Если код не равен 58, я не имею права проводить трансфер (значит надо анализировать ошибки). Поэтому, перейдя к ошибке (error-метка), я начну разбираться, в чем дело и это будет примерно так:
    error:
    test al,1
    jnz exit ; (команда завершилась с ошибкой, дергаться бесполезно - может я наткнулся на ATAPI или с параметрами сплаховал ?)

    test al,8
    jz exit ; готовность есть, трансфера нет - ужас. Нереально, но готовы и к этому.

    Можно протестировать биты #10 & #40 - но уже легче от этого не станет.

    Таже ошибка что и у dess. Прочитай посты #20 и #21. - мне не понравилось эта высокомерная фраза, ибо в моем фрагменте (соглашусь, неполном) ошибок нет. И не важно, с чем имеешь дело - ПАТА или САТА - алгоритмы одинаковы, не раз пройдены под отладчиком. И еще - я не читал всю ветку и Ваши ответы (лень, только первый пост-вопрос и сразу мой ответ) - надеюсь, это не преступление ?
     
  20. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    dess
    хард видится как Primary IDE Master - во, это другое дело. Я это к тому, чтоб манипулировать реальными адресами для Вашей системы (т.е. можно прогонять фрагменты кода под отладчиком). Хотелось еще от Вас базу Bus Master - контроллера вытянуть, для полного счастья (или уже УДМА не интересует ?)

    на SATA после посыла команды чтения сектора достаточно ожидать данных от HDD (DRQ=1) и освобождения канала (BSY=0), после чего можно просто забрать считанные данные. - да нет, уважаемый. Надо проверять сначала бит #1 (команда завершилась успешно или с ошибкой ?), а затем только Ваши любимые #80 & #8. Хотя этого мало - надо проверять все биты на корректность - то бишь 58h в моем конкретном примере.