OSDev http://osdev.su/ |
|
driver VGA http://osdev.su/viewtopic.php?f=7&t=834 |
Страница 2 из 6 |
Автор: | pavia [ 02 июн 2017, 15:37 ] |
Заголовок сообщения: | Re: driver VGA |
Пишешь драйвер под свою видеоконтроллёр и изменяешь при помощи своего API. А без уточнения какой у вас контроллёр врятли кто ответит. |
Автор: | Himik [ 02 июн 2017, 22:06 ] |
Заголовок сообщения: | Re: driver VGA |
Наверно он про VGA. При желании можно найти много документации на регистры VGA. Например здесь https://rutracker.org/forum/viewtopic.php?t=288318 https://rutracker.org/forum/viewtopic.php?t=740288 Качать через анонимную надстройку http://www.anonymox.net/en |
Автор: | sabir [ 12 июн 2017, 02:12 ] |
Заголовок сообщения: | Re: driver VGA |
Привет всем! Столкнулся с проблемой, которую не получается разрешить с помощью google, прошу помощи сообщества. Вводные данные: имеется в наличии 3 физических компьютера и один виртуальный (QEMU) имеется желание потрогать VESA через VBE за мягкие места, она с радостью дает себя потрогать, но только в 3 случаях из 4, а именно: 1. Ноутбук ASUS Eee PC 1003HAG с интегрированной видеокартой Intel на борту (ДАЕТ) 2. Ноутбук ASUS X453S с интегрированной видеокартой Intel на борту (ДАЕТ) 3. Эмулятор QEMU, работает на PC Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz (Haswell если что) с интегрированной видеокартой Intel на борту (ДАЕТ) 4. Собственно PC Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz с интегрированной видеокартой Intel на борту (НЕ ДАЕТ) Как именно не дает: "MACHINE CHECK ERROR" и уходит в ребут Почему не дает: Код: mov dword [0x8000], 'VBE2' mov di, 0x8000 ; адрес буффера под структуру 'VbeInfoBlock' mov ax, 0x4F00 ; Return VBE Controller Information int 0x10 ; пока все ОК, если здесь будет cli + hlt, проблем нет, а вот дальше mov edi, dword [0x8000+14] ; [VbeInfoBlock.VideoModePtr] ; Вот как раз здесь и не дает: mov cx, word [edi] ; а можно потрогать за номер видеорежима or cx, 0x4000 ; always try to use linear buffer mov di, 0x9000 ; Pointer to ModeInfoBlock structure mov ax, 0x4F01 ; Return VBE Mode Information int 0x10 Так почему же все таки не дает: Все дело в том, что в первых 3-х случаях адрес [VbeInfoBlock.VideoModePtr] помещается в WORD, что то типа 0x8040, а в последнем случае имеется 0xC000903D, т.е. в районе 3GB, ну так нет проблем милая, переходим в Unreal Mode и пытаемся потрогать в нем, опять не дает, так может Unreal Mode не работает, пробуем код: Код: mov eax, 0x0000F008 ; обрезанный адрес 0x9DFFF008 mov eax, [eax] call printx mov eax, 0x9DFFF008 ; НЕ обрезанный адрес 0x9DFFF008 mov eax, [eax] call printx получаем разные значения: Код: 0x00000000 0x9DFFFC08 т.е. Unreal Mode таки работает, а что же не так, почему за 0x9DFFF008 потрогать можно, а за 0xC000903D нельзя, они же рядом. А вот почему: Код: $ dmesg Среди всего прочего видим, что потрогать я хочу именно там, где надо: Код: Reserving Intel graphics memory at 0x000000009f200000-0x00000000c11fffff т.е. адресок 0xC000903D аккурат расположен там, где надо, но потрогать его можно только после свадьбы, но вот есть другой адресок 0x9DFFF008, а что же это за адресок: Код: BIOS-e820: [mem 0x000000009dfff000-0x000000009dffffff] usable Я понимаю, что диапазон адресов 0x000000009f200000-0x00000000c11fffff зарезервирован под 'Intel graphics memory', не вижу препятствий, однако есть подозрение, что это не просто адреса, а мапнутые порты и как раз попытка прочитать из порта как из обычной памяти и вызывает "MACHINE CHECK ERROR" Собственно что делать то, как получить список номеров видеорежимов, ежели он расположен в адресе, доступ к которому запрещен? |
Автор: | Himik [ 12 июн 2017, 18:42 ] |
Заголовок сообщения: | Re: driver VGA |
В 32-битном значении VbeInfoBlock.VideoModePtr содержится два 16-битных числа сегмент:смещение. Сегмент надо умножить на 16 и сложить со смещением, чтобы получился линейный адрес. Только он тебе не нужен, загружай сегмент в сегментный регистр ES и читай через него. Проверил, VESA работает нормально. |
Автор: | pavia [ 13 июн 2017, 07:18 ] |
Заголовок сообщения: | Re: driver VGA |
Подтверждаю слова химика. Более того через PM интерфейс VESA так же возвращается 16 бит сегмент и 16 битное смещение в формате реального режима. Которые так же надо умножать и складывать. |
Автор: | sabir [ 13 июн 2017, 15:02 ] |
Заголовок сообщения: | Re: driver VGA |
Himik, pavia Спасибо парни, все заработало А может кто знает, как напрямую пообщаться со встроенной интеловской видеокартой. Я не имею ввиду 3D ускорение и т.п., речь идет о том, что VESA очень медленная, т.к. работает через PCI 1.0 (или типа того) и ограничена пропускной способностью шины, в тоже самое время, интеловские кары не имеют собственной видеопамяти, в используют системную. Так собственно зачем мне обращаться через шину PCI, когда можно писать напрямую в память карты, скорость которой ограничена только скоростью самой памяти. Мне бы что то типа этого: 1. Опрашиваем через порты PCI интеловскую карту, милая, а где у тебя расположен мапнутый видеобуфер? 2. Получаем адрес видеобуфера и пишем туда напрямую и VESA не нужна. 3. Такое решение сразу станет железозависимым, но меня это совсем не смущает Я знаю, что это все реализовано, например в ядре Linux, но размер сорцов огромный, может кто уже разобрался? |
Автор: | Himik [ 13 июн 2017, 18:33 ] |
Заголовок сообщения: | Re: driver VGA |
Через функцию 4F01h "GET SuperVGA MODE INFORMATION" получаем структуру данных, там есть линейный адрес LFB по смещению 28h. И при включении "SET SuperVGA MODE" к номеру режима надо добавлять бит 4000h, оr bx,4000h. |
Автор: | dixie [ 14 июн 2017, 10:11 ] |
Заголовок сообщения: | Re: driver VGA |
И Write Combine на эту память не забываем ставить |
Автор: | sabir [ 14 июн 2017, 19:34 ] |
Заголовок сообщения: | Re: driver VGA |
dixie писал(а): И Write Combine на эту память не забываем ставить dixie Какая замечательная подсказка, большое спасибо, почитал в google про эту мульку, все хвалят, уверяют в ускорении графики в 5-20 раз, однако, вменяемого способа как это сделать физически мне найти так и не удалось, нужна еще подсказка. Вот что мне удалось нарыть (далее может быть написана глупость, именно по этой причине нужна еще одна подсказка): 1. Определить адрес LFB, плевое дело, предположим что это 0xFD000000 2. Определить размер LFB, так же плевое дело, предположим что это 1920 * 1080 * 4 = 8294400 = 0x007E9000 3. Указанный диапазон адресов, а именно: 0xFD000000 - 0xFD7E9000, необходимо пометить как write-combine, она же WC, для этого: 3.1. В регистре CR0 включаем кэширование: сбросить биты NW (бит №29) и CD (бит №30). По дефолту они и так сброшены. 3.2. В регистре CR3 имеются два бита: PCD (бит №4) и PWT (бит №3). В моем случае оба равны нулю, что реально надо сделать (оставить как есть, оба возвести или возвести какой то один, какой)? 3.3. Нужны ли какие то действия с регистром IA32_EFER? 3.4. Кроме того в "свойствах" отдельно взятых страниц, директорий страниц и каталога директорий, так же есть заветные биты PCD (бит №4) и PWT (бит №3), а с ними что делать? На сегодняшний день я мапаю физические (2-х мегабайтные) страницы так: Код: ... ; Set up PDT ; адрес PDT = 0x4000 mov edi, PDT mov eax, 10000011b ; 2MiB / ... / R/W / PDT present mov ecx, 512*4 ; отжимаем 4GB: 4 PDT по 1GB (512 * 2MB) create_pages: mov dword [edi+0], eax mov dword [edi+4], 0 add eax, 0x200000 ; + 2 MB add edi, 8 loop create_pages Правильно ли я понимаю, что после этого нужно внести исправления в "свойства" конкретных страниц PDT, а именно: диапазон адресов 0xFD000000 - 0xFD7E9000, а эти исправления связаны с флагами PCD (бит №4) и PWT (бит №3)? А выше стоящие уровни (PDPT и PML4T) тоже надо потрогать этими флагами или ограничиться PDT? Я что то упустил или вообще не туда рою? |
Автор: | dixie [ 14 июн 2017, 20:19 ] |
Заголовок сообщения: | Re: driver VGA |
Можно ставить через MTRR, но там на порядок больше траха Если всегда страничный режим, то через PAT, эти самые биты PAT/PCD/PWT в описании страницы ... Их сумма - индекс в отдельном MSR, где можно прописать 8 типов кэша на выбор (обычно там стандартное значение). Подробнее см в "Memory Cache Control" у интела. IA32_EFER не нужен, это всё доступно начиная с P3 по умолчанию. В вышестоящих уровнях биты трогать не надо - только у самой страницы. |
Страница 2 из 6 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |