
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (51) « Первая ... 42 43 [44] 45 46 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#646
,
|
|
|
Я пишу ISA-ROM модуль для bios (в учебных целях
![]() |
Сообщ.
#647
,
|
|
|
Насколько я понимаю, стандартные расширения BIOS запускаются в реальном режиме процессора, с сегментной моделью памяти. Находясь в этом режиме, ты, естественно, не сможешь напрямую обратиться к тем дальним адресам. Просто не хватит битов в адресных регистрах.
Но никто не мешает внутри процедуры перейти в 32-битный режим - тогда все адреса станут доступными. На уровне BIOS мы имеем самый нормальный реальный режим работы, без каких-либо менеджеров памяти и, соответственно, всяких VCPI-DPMI. Как перейти в 32-битный режим и вернуться обратно, описано неоднократно во многих местах. А если лень идти в 32-битный режим, можно попробовать работать через прерывание 15h. Судя по описанию, это прерывание BIOS, и потому к моменту запуска модуля расширения должно уже быть активировано. Но я не очень в этом уверен, поэтому надо просто попробовать. |
Сообщ.
#648
,
|
|
|
Цитата Modulator @ Смогу ли я из-под bios напрямую обратиться к этим регистрам? Вобще-то современные BIOS'ы давно не влазят в отведенные им несколько десятков килобайт и работают, насколько мне известно, в 32(64)х-разрядном режиме, перед запуском загрузчика переключаются обратно в реальный режим. Модули расширения по идее в целях совместимости тоже должны запускаться в реальном режиме. |
Сообщ.
#649
,
|
|
|
Разрешите помучаю вас еще одним вопросом) Как из адреса типа F0804000H получить 24-битный линейный адрес для GDT, что бы использовать Int 15?
|
Сообщ.
#650
,
|
|
|
Цитата Modulator @ Как из адреса типа F0804000H получить 24-битный линейный адрес для GDT, что бы использовать Int 15? Никак. 24х-битный адрес это для 16-битный сегментов. Ищи описание 32х-битных сегментов GDT. Там в записях GDT один бит отвечает за разрядность сегмента. Я же со своей стороны не советую маяться с этим прерыванием а просто юзать защищенный/нереальный режим. Код перехода гуглится на раз-два вместе с уже готовой таблицой GDT. |
Сообщ.
#651
,
|
|
|
shm, неправда ваша. Смотри мой постинг в этой теме выше: Желающим USB под ДОС (сообщение #3236065). Лично я с этого и начинал, и проблем никаких не было. На OHCI получал скорость при посекторном чтении порядка 400 Кб/с.
|
Сообщ.
#652
,
|
|
|
Цитата zakharo @ shm, неправда ваша Что конкретно неправдивого? Цитата zakharo @ Лично я с этого и начинал, и проблем никаких не было. На OHCI получал скорость при посекторном чтении порядка 400 Кб/с. Если есть возможность сделать по-нормальному, то зачем делать через заднее место? Я понимаю, что тебе запретили, но, ТС, насколько я понимаю, может юзать все, что угодно. |
Сообщ.
#653
,
|
|
|
Цитата shm @ Что конкретно неправдивого? В описании http://www.delorie.com/djgpp/doc/rbinter/it/99/4.html ничего не сказано про размерность сегмента. И нет никаких специальных битов. Просто указана разница для 286 и 386+ процессоров. Я это дело использовал не только потому, что мне запретили, но и потому, что считал, что лучше пользоваться документированными и легальными возможностями. Просто для лучшей совместимости и переносимости. Это int 15h в ДОСе работает под любыми менеджерами расширенной памяти, а также и в виртуальном режиме. Вся реальная обработка происходит там, где ей и положено. То есть всю ответственность за обработку берет на себя тот софт, который меня запускает. В том числе учитывая возможную трансляцию адресов. Нереальный режим я всегда считал неким полухакерским подходом. А в полноценном 32-битном режиме в полный рост встает проблема драйверов для всякой периферии. Но в данном случае я с тобой соглашусь - для расширения BIOS режим unreal, пожалуй, подходит лучше всего. |
Сообщ.
#654
,
|
|
|
Вот так я перехожу в защищенный режим
![]() ![]() 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 |
Сообщ.
#655
,
|
|
|
Цитата 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 например так: ![]() ![]() mov EBX, 0f0804000h mov DX, GS:[EBX] При условии, что дескриптор ты загрузил в GS. Еще одно примечание: если ты в реальном режиме изменишь содержимое этого сегментного регистра, то естественно сдвинется его база. Т.е. будет EBX + (GS*16). Ксатити в этом отлично просматриваться костыль в реализации RM в IA-32. По желанию можешь потом восстановить предел и базу сегментного регистра .но это не обязательно. Добавлено Ладно, дарю: ![]() ![]() [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 ПС: Код работает везде, если не работает, то ищи ошибку у себя. |
Сообщ.
#656
,
|
|
|
shm, Огромное спасибо
![]() Прочитал значение по BAR+0 и там находится значение 10H. Как я понял из спецификации в HcRevision это и должно находится, да? |
Сообщ.
#657
,
|
|
|
Цитата Modulator @ Как я понял из спецификации в HcRevision это и должно находится, да? Да. Более подробно про OHCI рассказать не могу, почти не работал с ним. Могу про UHCI и EHCI. Подожди zakharo, он писал под него, да и по остальных хостам куда глубже меня копнул. |
Сообщ.
#658
,
|
|
|
Цитата Modulator @ shm, Огромное спасибо ![]() Прочитал значение по BAR+0 и там находится значение 10H. Как я понял из спецификации в HcRevision это и должно находится, да? По смещению 0 находится read-only регистр HcRevision. Там записана версия спецификации OHCI в двоично-десятичном формате. То есть 10h - это версия 1.0, как и должно быть. В своих изысканиях я никогда не встречал другой версии. Стало быть, прочитал ты этот регистр правильно. Ну, поздравляю - начало положено, теперь действуй строго по описанию OHCI http://www.compaq.com/productinfo/development/openhci.html (надеюсь, оно у тебя уже есть). |
Сообщ.
#659
,
|
|
|
Документ давно уже скачал, но в английском не особо силен.
Мне нужно получить серийники всех подключенных USB устройств. Для этого сначала нужно самому заполнить HcHCAA,HcControlHeadED,HcBulkHeadED. Потом каждому устройству присвоить номер с помощью SET_ADDRESS и после запросить дескриптор устройства по заданному номеру?Но куда отправлять SET_ADDRESS? |
Сообщ.
#660
,
|
|
|
Для SET_ADDRESS сформировать TD и записать его в ED нужного устройства?
Добавлено А ED сформировать самому и записать в HCCA? |