Программирование HDD UDMA

Тема в разделе "WASM.ELECTRONICS", создана пользователем _First_, 6 янв 2006.

  1. _First_

    _First_ New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2006
    Сообщения:
    7
    Вопрос для знатоков в низкоуровневом программировании:

    Стоит такая задача: на ассемблере организовать запись/чтение информации из HDD (FAT32, из файла большого размера - порядка сотен Мб) в память (для организации доступа ко всему объему физической памяти используется так называемый Unreal Mode) и обратно с произвольным доступом (т.е. чтоб кусками можно было переписывать файл, предпочтительно с максимальной скоростью считывания с диска - такое достигается, если сектора всего файла располагаются один за другим, т.е., файл не фрагментирован, т.е. найти на диске свободную область нужного размера, а затем писать в нее файл) в режиме UDMA с прямым доступом к секторам диска без использования VM, PM. Только в RM. Можно пример под DOS. Всякие extenders, DPMI, VCPI, использовать Windows не предлагать. Файл порядка сотен Мб с двоичными данными пусть располагается в корневом разделе диска. Предполагается, что для этой программы доступен только сервис BIOS, ну и DOS (если поможет).



    В книге Кулакова "Прогрммирование на аппаратном уровне" есть только "Программа, выполняющая считывание загрузочного сектора Maser-диска канала 1 в режиме DMA". Т.е., только одного сектора. Это простой пример. Поиск по инету через поисковики ничего стоящего не дал. Если у кого-то есть более подробная информация, описывающая данную проблему, или ссылки на инет, буду рад помощи.



    Откровенно могу сказать, что раньше программированием портов HDD не занимался. Поэтому, возможно, разобраться в неработающем коде не смогу. Может у кого будут готовые сырцы или ссылки - буду рад.
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    А на режим/экстендеры там как-то пофигу -- busmaster'у передается физ. адрес.



    Инфа по программированию ATA-устройств здесь:

    www.t13.org

    (Project Drafts)



    Отправная точка -- команда READ DMA.
     
  3. _First_

    _First_ New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2006
    Сообщения:
    7
    Да. Это конечно хорошо, что у меня теперь есть даташит на 339 листов. Но там нет никаких примеров программирования режима UDMA. Описания регистров и т.д. Команду Write и Read DMA нашел, но не думал, что за одно обращение можно прочитать/записать только 256 секторов. Может кто-то может указать ссылки на программы/примеры программирования? А то я никогда не занимался программированием ATA-устройств, боюсь не разберусь и "напортачу".
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Я забыл, там же нигде басмастер не описывается. Вот ещё важная дока:

    Programming Interface for Bus Master IDE Controller

    Ссылку не помню, имя файла -- idems100.pdf



    Базу регистров басмастера кстати можно переносить, средствами чипсета. ;)



    Пример есть в статьях, http://wasm.ru/article.php?article=atazen02
     
  5. _First_

    _First_ New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2006
    Сообщения:
    7
    Спасибо за ссылки. Как говорится, а слона то я и не увидел. Ведь инфа, которая нужна, представлена в статьях на этом сайте, правда не в нужном объеме, а я бегло глянул, и не обратил внимание. В качестве начальной информации может пригодиться Программирование ATA устройств
     
  6. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Джеффри Рихтер Windows для профессионалов.



    t13.org/ вот всё, что тебе нужно )
     
  7. _First_

    _First_ New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2006
    Сообщения:
    7
    В том то и дело, что мне не нужно Win32 API, хочу обойтись без Windows и др. ОС защищенного режима и их API. А на t13.org примеров маловато будет.
     
  8. _First_

    _First_ New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2006
    Сообщения:
    7




    Этот пример по чтению 1 сектора в режиме UDMA, к сожалению, слишком простой, работа с FAT в режиме UDMA вообще непонятна (сначала найти сектор, потом его считать, ведь контроллер сам не находит следующий сектор файла?).