На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (51) « Первая ... 20 21 [22] 23 24 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Спасибо за ответы, покодю, надеюсь поможет.

    Цитата cppasm @
    Из реального режима к этим адресам доступа нет, только к первому мегабайту.
    :(
    Жалко. Знал ведь что так просто не получится!
      Цитата lojkofob @
      Спасибо за ответы, покодю, надеюсь поможет.

      Цитата cppasm @
      Из реального режима к этим адресам доступа нет, только к первому мегабайту.
      :(
      Жалко. Знал ведь что так просто не получится!

      Все получится. Надо воспользоваться функцией 87h прерывания 15h
      Процедура на Ассемблере

      GLOBDESC LABEL BYTE
      zeroes db 16 dup (0)
      srcLen dw 4;0ffffh
      lowSrcAddr dw ?
      hiSrcAddr0 db ?
      srcAccess db 93h
      extSrcRights db 0fch
      hiSrcAddr1 db ?
      dstLen dw 4;0ffffh
      lowDstAddr dw ?
      hiDstAddr0 db ?
      dstAccess db 93h
      extDstRights db 0fch
      hiDstAddr1 db ?
      zeroes2 db 16 dup (0)
      GlobWrite PROC USES es si ds eax,
      SRCADDR:DWORD,DSTADDR:DWORD
      mov ax,cs
      mov ds,ax
      mov es,ax
      mov si,offset GLOBDESC
      mov eax,SRCADDR
      mov lowSrcAddr,ax
      shr eax,16
      mov hiSrcAddr0,al
      mov hiSrcAddr1,ah
      mov eax,DSTADDR
      mov lowDstAddr,ax
      shr eax,16
      mov hiDstAddr0,al
      mov hiDstAddr1,ah
      mov ax,8700h
      mov cx,2
      int 15h
      ret
      GlobWrite ENDP
        Для тех, кто хочет работать в нереальном режиме, но не знает как в него войти, даю готовый объектный модуль... Там всего одна функция _unreal_init (если использовать из ЯВУ, то возможно придется объявлять без первого подчеркивания, т.е. просто unreal_init) которая устанавливает этот режим. После установки режима, доступ к физической можно получить через GS. Вот пример чтения двойного слова по адресу 0x12345678:
        ExpandedWrap disabled
          mov EBX, 0x12345678
          mov EAX, GS:[EBX]; для некоторых компиляторов [GS:EBX]
          ;в EAX нужное двойное слово

        Примерно такой код можно использовать в ассемблерных вставках, только не забывать указать линкеру, чтобы было разрешено использовать 32-битовые операции.

        Прикреплённый файлПрикреплённый файлunreal.rar (322 байт, скачиваний: 133)
        Сообщение отредактировано: shm -
          Всем привет!
          Тема USB под ДОС занимает меня уже года 4 как..
          В результате написал программку типа Norton Commander, которая работает с устройствами mass-storage (флешками, картридерами, флоппиками, CDROM и т.п.), поддерживает USB-хабы. Может качать файлы туда-сюда, создавать и удалять директории, просматривать 16-ричный дамп как файлов, так и носителя в целом, чистить (обнулять) и форматировать носители, ставить метки диска (LABEL), ну и всякие другие полезные вещи делать.
          В программе реализована работа с контроллерами UHCI, OHCI, EHCI; протоколы Bulk-Only и Control-Bulk-Intterrupt; системы команд SCSI-2, ATAPI, MMC-3. Она сама (без помощи ДОС) работает с файловыми системами FAT12/FAT16/FAT32/ISO9660.
          Есть простенькая поддержка USB-клавиатуры.
          Синхронными устройствами типа видео-аудио не занимался за ненадобностью.
          Так что ежели кому какая помощь в реализации нужна - милости просим, чем смогу - помогу.
            zakharo, я тоже подобное реализовывал, только в рамках драйверов для своей ОС, из ФС еще и писал драйвер NTFS, ну и дисковых операций чуточку побольше, правда поддержки OHCI у меня нет, ибо не имею такого контроллера.
              shm, а информацией по NTFS не поделишься? Сильно хочу в эту прогу добавить поддержку NTFS, но как-то полного описания не нашел.
                zakharo, полного описания ты и не найдёшь. NTFS в общем-то не документирована. Но если погуглить, можно найти информацию, достаточную для создания read-only драйвера. Если не ошибаюсь, мыщъх как-то дал довольно подробную информацию. Разве что малопопулярные аттрибуты и индексы не рассмотрел. Погуглить можно по "Linux-NTFS Project".
                  Цитата Qraizer @
                  NTFS в общем-то не документирована

                  Да, но не совсем. Существует некое подобие документации от Linux NTFS Project, хотя там конечно многое не освещено, но если человек уже с файловыми системами работал вплотную, то интуиция многое подскажет...

                  Добавлено
                  zakharo, я предлагаю не оффтопить, поэтому я кину тебе номер аси в ПМ, а там уже подгоню доки и может разъясню некоторые основополагающие вещи...
                    Скажите, пожалуйста, как-то до этого не возникал вопрос, а вот тут...
                    Для использования GS в режиме 4Gb-ой адресации использовал всем небезызвестный пример из Кулакова.
                    Ну использовал и использовал, в подробности не вдавался... а вот тут вдруг надо перед использованием понять, а надо ли это вообще, или уже можно и так использовать его.
                    Как-то в последних BIOS уже он оказывается переведён в такой режим и повторная его инициализация приводит к проблемам.
                      Инициализировать надо.
                      Это у тебя BIOS что-то умничает сильно.
                      А какие там проблемы при повторном переходе?
                      Кстати использовать можно не только GS, можно любой сегментный регистр настроить (я лимит у всех меняю, кроме CS).
                        Цитата lsvmo @
                        Как-то в последних BIOS уже он оказывается переведён в такой режим и повторная его инициализация приводит к проблемам.

                        При грамотной реализации драйвера нереального режима никаких проблем с его инициализацией быть не должно даже в том случае, если он уже установлен. Другое дело, что БИОС вполне может юзать тоже самое в своих прерываниях (как правило при работе с современными дисковыми контроллерами, где нужен доступ к MMIO), вот это как раз не учел Кулаков. Если не инициализировать в таком случае, то грабельки могут быть в том, что "биосовский" GS не обязательно может иметь базу = 0 и предел = 4Гб. Но в любом случае инициализировать надо, у меня на одной машине БИОС тоже GS в унреал вводит, но проблем из-за моего драйвера вроде не было.
                        Сообщение отредактировано: shm -
                          Цитата cppasm @
                          Это у тебя BIOS что-то умничает сильно.

                          Да уж... Современный BIOS это нечто... пора бы уже Windows не систему выпускать над BIOS, а прошивать систему в BIOS и всё. :D
                          Цитата cppasm @
                          А какие там проблемы при повторном переходе?

                          Проблема одна - всё виснет :wall:
                          Вот и стоит вопрос, можно ли как-то понять, инициализирован регистр или нет. Ибо в противном случае (если не инициализирован), то также будет зависание при обращении за пределы 1Мб
                            В голову приходит единственный способ: выйти в SMM, посмотреть в кэше сегментных регистров и использовать эту информацию для восстановления после своих изменений. Боюсь только, что это задача отнюдь не проще.
                              Цитата lsvmo @
                              Проблема одна - всё виснет

                              При вызове прерывания BIOS? Если нет, то значит чего-то неправильно делаешь, может сама процедура Кулакова фейлит, у него там в книге ошибок хватает почти во всех примерах...
                              Цитата lsvmo @
                              Вот и стоит вопрос, можно ли как-то понять, инициализирован регистр или нет.

                              :wacko: Что значит инициализирован? Если ты имеешь ввиду сегментный регистр, то он всегда имеет теневую часть (в ЦП >= i386), записать в теневую часть из реального режима нельзя, поэтому и требуется временно переходит в защищенный (хотя у Кулакова там больно накручено, можно на порядок проще сделать). Теневая часть сегментного регистра загружается из таблички GDT. В защищенном режиме в сегментный регистр пишется не смещение, а селектор - фактически указатель нужной записи (дескриптора) для регистра в GDT (+ еще некоторые флаги). При этом ЦП автоматически обновляет теневую часть. В принципе можно сохранить селектор из сегментного регистра и найти соотв, дескриптор в GDT, но только при условии, что сама таблица GDT не потерта в памяти(!), а вот большинство подобных процедур (в т.ч. и Кулакова ее не сохраняет). Таблица GDT, если не перезаписывать селектор в сегментном регистре, не нужна (в реальном режиме селектор и не перезапишешь), т.е. теневая часть (собственно "кусочек" GDT) и хранится в нем. Напрямую сохранить теневую часть регистра вроде нельзя (тем более в реальном режиме). При записи в сегментный регистр в реальном режиме меняется база теневой части. В чистом реальном (который на 32(64)х разрядных ЦП не совсем реальный в любом случае) теневая часть сегментных регистров содержит базу = 0, предел = 1Мб + 64К - 16 (может ошибаюсь, но вроде так). Но BIOS'сы могут сделать и скажем так база = 0, предел = 4Гб, причем не обязательно у GS. При этом как ни парадокс, но все должно работать (в чем кстати ошибся Кулаков), т.к. в реальном режиме при записи в сегментный регистр в теневой части меняется только база. А доступ к расширенной памяти все рано можно получить только указав 32-битовое смещение. Вот только надо учесть, что если хоть раз что-то записать в сегментный регистр после перехода в "уноеал", то это "что-то"*16 будет постоянно прибавляться к смещению в т.ч. и 32-битовому.

                              Добавлено
                              Цитата lsvmo @
                              то также будет зависание при обращении за пределы 1Мб

                              Не обрабатываемый "General protection fault" detected. :D Значит смещение превышает предел в теневой части сегментного регистра. Скорее всего процедура инициализации неправильно перезаписывает теневую часть. Кстати, перезаписывать теневую часть можно сколько угодно раз (почему - я уже написал выше), т. е. то, что БИОС там уже, что-то свое записал не должно привести к ошибке. Попробуй воспользоваться для отладки эмулятором Bochs - его логи тебе ооочень помогут. Кстати ,а на другой машине ты пробовал тестить?

                              Добавлено
                              Цитата Qraizer @
                              выйти в SMM, посмотреть в кэше сегментных регистров и использовать эту информацию для восстановления после своих изменений

                              Зачем? :huh:
                              Сообщение отредактировано: shm -
                                Чтобы прочитать ту самую теневую часть.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) « Первая ... 20 21 [22] 23 24 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0733 ]   [ 17 queries used ]   [ Generated: 22.07.25, 17:59 GMT ]