На главную Наши проекты:
Журнал   ·   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) « Первая ... 42 43 [44] 45 46 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Я пишу ISA-ROM модуль для bios (в учебных целях :) ). Смогу ли я из-под bios напрямую обратиться к этим регистрам? Или действовать нужно так же как и под ДОСом?
      Насколько я понимаю, стандартные расширения BIOS запускаются в реальном режиме процессора, с сегментной моделью памяти. Находясь в этом режиме, ты, естественно, не сможешь напрямую обратиться к тем дальним адресам. Просто не хватит битов в адресных регистрах.
      Но никто не мешает внутри процедуры перейти в 32-битный режим - тогда все адреса станут доступными. На уровне BIOS мы имеем самый нормальный реальный режим работы, без каких-либо менеджеров памяти и, соответственно, всяких VCPI-DPMI. Как перейти в 32-битный режим и вернуться обратно, описано неоднократно во многих местах.
      А если лень идти в 32-битный режим, можно попробовать работать через прерывание 15h. Судя по описанию, это прерывание BIOS, и потому к моменту запуска модуля расширения должно уже быть активировано. Но я не очень в этом уверен, поэтому надо просто попробовать.
        Цитата Modulator @
        Смогу ли я из-под bios напрямую обратиться к этим регистрам?

        Вобще-то современные BIOS'ы давно не влазят в отведенные им несколько десятков килобайт и работают, насколько мне известно, в 32(64)х-разрядном режиме, перед запуском загрузчика переключаются обратно в реальный режим. Модули расширения по идее в целях совместимости тоже должны запускаться в реальном режиме.
        Сообщение отредактировано: shm -
          Разрешите помучаю вас еще одним вопросом) Как из адреса типа F0804000H получить 24-битный линейный адрес для GDT, что бы использовать Int 15?
            Цитата Modulator @
            Как из адреса типа F0804000H получить 24-битный линейный адрес для GDT, что бы использовать Int 15?

            Никак. 24х-битный адрес это для 16-битный сегментов. Ищи описание 32х-битных сегментов GDT. Там в записях GDT один бит отвечает за разрядность сегмента. Я же со своей стороны не советую маяться с этим прерыванием а просто юзать защищенный/нереальный режим. Код перехода гуглится на раз-два вместе с уже готовой таблицой GDT.
              shm, неправда ваша. Смотри мой постинг в этой теме выше: Желающим USB под ДОС (сообщение #3236065). Лично я с этого и начинал, и проблем никаких не было. На OHCI получал скорость при посекторном чтении порядка 400 Кб/с.
              Сообщение отредактировано: zakharo -
                Цитата zakharo @
                shm, неправда ваша

                Что конкретно неправдивого?
                Цитата zakharo @
                Лично я с этого и начинал, и проблем никаких не было. На OHCI получал скорость при посекторном чтении порядка 400 Кб/с.

                Если есть возможность сделать по-нормальному, то зачем делать через заднее место? Я понимаю, что тебе запретили, но, ТС, насколько я понимаю, может юзать все, что угодно.
                  Цитата shm @
                  Что конкретно неправдивого?

                  В описании http://www.delorie.com/djgpp/doc/rbinter/it/99/4.html ничего не сказано про размерность сегмента. И нет никаких специальных битов. Просто указана разница для 286 и 386+ процессоров.
                  Я это дело использовал не только потому, что мне запретили, но и потому, что считал, что лучше пользоваться документированными и легальными возможностями. Просто для лучшей совместимости и переносимости.
                  Это int 15h в ДОСе работает под любыми менеджерами расширенной памяти, а также и в виртуальном режиме. Вся реальная обработка происходит там, где ей и положено. То есть всю ответственность за обработку берет на себя тот софт, который меня запускает. В том числе учитывая возможную трансляцию адресов.
                  Нереальный режим я всегда считал неким полухакерским подходом. А в полноценном 32-битном режиме в полный рост встает проблема драйверов для всякой периферии.
                  Но в данном случае я с тобой соглашусь - для расширения BIOS режим unreal, пожалуй, подходит лучше всего.
                  Сообщение отредактировано: zakharo -
                    Вот так я перехожу в защищенный режим
                    ExpandedWrap disabled
                              cli
                              in         al,70h            
                              or         al,80h            
                              out        70h,al
                       
                              in        al,92h
                              or        al,2
                              out       92h,al
                              mov       dx,2
                       
                              mov        eax,cr0          
                              or         al,1              
                              mov        cr0,eax          
                       
                              mov       eax,0f0804000h
                              mov       dx,[eax]
                       
                              mov        eax,cr0            
                              and        al,0FEh            
                              mov        cr0,eax            
                       
                       
                              in        al,92h    
                              and       al,0fdh  
                              out       92h,al    
                       
                              in         al,70h          
                              and        al,07Fh        
                              out        70h,al
                       
                              sti
                              ret

                    Правильно ли я считываю значение? Содержимое регистра dx после выполнения всегда равно 0
                      Цитата zakharo @
                      В описании http://www.delorie.com/djgpp/doc/rbinter/it/99/4.html ничего не сказано про размерность сегмента. И нет никаких специальных битов. Просто указана разница для 286 и 386+ процессоров.

                      Читаем. Этим прерыванием я не пользовался, тестировать лень, но раз ты утверждаешь, то предположиу, что бит Sz BIOS автоматом выставляет, но все же сильно сомневаюсь.

                      Добавлено
                      Цитата zakharo @
                      Нереальный режим я всегда считал неким полухакерским подходом

                      Та нету на IA-32 реального режима как такового, реальный режим сам по себе - костыль. И так называемый "нереальны" точно тоже самое.
                      Цитата zakharo @
                      А в полноценном 32-битном режиме в полный рост встает проблема драйверов для всякой периферии.

                      Не соглашусь. Все, что нужно, можно запустить через V86.
                      Цитата Modulator @
                      Вот так я перехожу в защищенный режим

                      Неправильно. Перед входом тебе нужно загрузить GDT и после входа в PM загрузить селекторы. Тупой переход в PM ничего не даст.

                      Добавлено
                      Modulator, вот алгоритм для тебя:
                      1. Заполняешь таблицу GDT (прямо в коде набиваешь),0й дескриптор - нулевой, й1 - база = 0, предел 4Гб, ну флаги там само собой (конкретные значения гуглятся на раз-два, если влом изучать табличку по моей ссылке).
                      2. Загружаешь GDT
                      3. Отрубаешь прерывания
                      4. Входишь в PM
                      5. Делаешь near безусловный переход на следующую инструкцию (чтобы почистить кэшь команд)
                      6. Загружаешь в любой сегментный регистр селектор со значением 8 (указывает первый наш дескриптор)
                      7. Выходишь из PM
                      8. Делаешь near безусловный переход на следующую инструкцию (чтобы почистить кэшь команд)
                      9. Включаешь перывания
                      10. Включаешь трансляцию адресов выше 1го мегабайта (еще один костыль IA-32)

                      И все, можешь спокойно обращаться через сегментный регистр в который загрузил наш дескриптор к MMIO например так:
                      ExpandedWrap disabled
                        mov EBX, 0f0804000h
                        mov DX, GS:[EBX]

                      При условии, что дескриптор ты загрузил в GS. Еще одно примечание: если ты в реальном режиме изменишь содержимое этого сегментного регистра, то естественно сдвинется его база. Т.е. будет EBX + (GS*16). Ксатити в этом отлично просматриваться костыль в реализации RM в IA-32.

                      По желанию можешь потом восстановить предел и базу сегментного регистра .но это не обязательно.

                      Добавлено
                      Ладно, дарю:
                      ExpandedWrap disabled
                        [BITS 16]
                        segment data
                        gd_reg:
                            dw 8192
                            dd gdt
                        gdt:
                            dw 0, 0, 0, 0
                            
                            db 0xFF     ; Сегмент кода с DPL=0
                            db 0xFF     ; Базой=0 и Лимитом=4 Гб
                            db 0x00
                            db 0x00
                            db 0x00
                            db 10011010b
                            db 0xCF
                            db 0x00
                            
                            db 0xFF     ; Сегмент данных с DPL=0
                            db 0xFF     ; Базой=0 и Лимитом=4Гб
                            db 0x00
                            db 0x00
                            db 0x00
                            db 10010010b
                            db 0xCF
                            db 0x00
                            
                        segment code
                        global _unreal_init
                        _unreal_init:
                            push EAX
                            push DS
                            xor EAX, EAX
                            mov AX, data
                            mov DS, AX
                            
                            shl EAX, 4
                            add [gd_reg + 2], EAX
                            lgdt [gd_reg]
                            
                            cli
                            mov EAX, CR0
                            or EAX, 1
                            mov CR0, EAX
                            jmp near pm1
                        pm1:
                            mov AX, 0x10
                            mov GS, AX
                            
                            mov EAX, CR0
                            and EAX, 0xFFFFFFFE
                            mov CR0, EAX
                            jmp near rm1
                        rm1:
                            sti
                            
                            in AL, 0x92
                            or AL, 2
                            out 0x92, AL
                            
                            pop DS
                            pop EAX
                            ret

                      ПС: Код работает везде, если не работает, то ищи ошибку у себя.
                      Сообщение отредактировано: shm -
                        shm, Огромное спасибо :D
                        Прочитал значение по BAR+0 и там находится значение 10H. Как я понял из спецификации в HcRevision это и должно находится, да?
                          Цитата Modulator @
                          Как я понял из спецификации в HcRevision это и должно находится, да?

                          Да. Более подробно про OHCI рассказать не могу, почти не работал с ним. Могу про UHCI и EHCI. Подожди zakharo, он писал под него, да и по остальных хостам куда глубже меня копнул.
                            Цитата Modulator @
                            shm, Огромное спасибо :D
                            Прочитал значение по BAR+0 и там находится значение 10H. Как я понял из спецификации в HcRevision это и должно находится, да?

                            По смещению 0 находится read-only регистр HcRevision. Там записана версия спецификации OHCI в двоично-десятичном формате. То есть 10h - это версия 1.0, как и должно быть.
                            В своих изысканиях я никогда не встречал другой версии.
                            Стало быть, прочитал ты этот регистр правильно.
                            Ну, поздравляю - начало положено, теперь действуй строго по описанию OHCI http://www.compaq.com/productinfo/development/openhci.html (надеюсь, оно у тебя уже есть).
                              Документ давно уже скачал, но в английском не особо силен.
                              Мне нужно получить серийники всех подключенных USB устройств.
                              Для этого сначала нужно самому заполнить HcHCAA,HcControlHeadED,HcBulkHeadED. Потом каждому устройству присвоить номер с помощью SET_ADDRESS и после запросить дескриптор устройства по заданному номеру?Но куда отправлять SET_ADDRESS?
                                Для SET_ADDRESS сформировать TD и записать его в ED нужного устройства?

                                Добавлено
                                А ED сформировать самому и записать в HCCA?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) « Первая ... 42 43 [44] 45 46 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0751 ]   [ 14 queries used ]   [ Generated: 19.07.25, 16:12 GMT ]