OSDev

для всех
Текущее время: 28 апр 2024, 05:42

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 02 июн 2017, 15:37 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Пишешь драйвер под свою видеоконтроллёр и изменяешь при помощи своего API.
А без уточнения какой у вас контроллёр врятли кто ответит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 02 июн 2017, 22:06 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Наверно он про VGA. При желании можно найти много документации на регистры VGA.
Например здесь
https://rutracker.org/forum/viewtopic.php?t=288318
https://rutracker.org/forum/viewtopic.php?t=740288
Качать через анонимную надстройку http://www.anonymox.net/en


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 12 июн 2017, 02:12 

Зарегистрирован: 12 июн 2017, 01:09
Сообщения: 18
Привет всем!
Столкнулся с проблемой, которую не получается разрешить с помощью 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"

Собственно что делать то, как получить список номеров видеорежимов, ежели он расположен в адресе, доступ к которому запрещен?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 12 июн 2017, 18:42 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
В 32-битном значении VbeInfoBlock.VideoModePtr содержится два 16-битных числа сегмент:смещение. Сегмент надо умножить на 16 и сложить со смещением, чтобы получился линейный адрес. Только он тебе не нужен, загружай сегмент в сегментный регистр ES и читай через него.

Проверил, VESA работает нормально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 13 июн 2017, 07:18 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Подтверждаю слова химика. Более того через PM интерфейс VESA так же возвращается 16 бит сегмент и 16 битное смещение в формате реального режима. Которые так же надо умножать и складывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 13 июн 2017, 15:02 

Зарегистрирован: 12 июн 2017, 01:09
Сообщения: 18
Himik, pavia
Спасибо парни, все заработало

А может кто знает, как напрямую пообщаться со встроенной интеловской видеокартой. Я не имею ввиду 3D ускорение и т.п., речь идет о том, что VESA очень медленная, т.к. работает через PCI 1.0 (или типа того) и ограничена пропускной способностью шины, в тоже самое время, интеловские кары не имеют собственной видеопамяти, в используют системную. Так собственно зачем мне обращаться через шину PCI, когда можно писать напрямую в память карты, скорость которой ограничена только скоростью самой памяти.
Мне бы что то типа этого:
1. Опрашиваем через порты PCI интеловскую карту, милая, а где у тебя расположен мапнутый видеобуфер?
2. Получаем адрес видеобуфера и пишем туда напрямую и VESA не нужна.
3. Такое решение сразу станет железозависимым, но меня это совсем не смущает
Я знаю, что это все реализовано, например в ядре Linux, но размер сорцов огромный, может кто уже разобрался?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 13 июн 2017, 18:33 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Через функцию 4F01h "GET SuperVGA MODE INFORMATION" получаем структуру данных, там есть линейный адрес LFB по смещению 28h.
И при включении "SET SuperVGA MODE" к номеру режима надо добавлять бит 4000h, оr bx,4000h.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 14 июн 2017, 10:11 

Зарегистрирован: 10 окт 2013, 14:54
Сообщения: 93
И Write Combine на эту память не забываем ставить ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 14 июн 2017, 19:34 

Зарегистрирован: 12 июн 2017, 01:09
Сообщения: 18
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?
Я что то упустил или вообще не туда рою?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: driver VGA
СообщениеДобавлено: 14 июн 2017, 20:19 

Зарегистрирован: 10 окт 2013, 14:54
Сообщения: 93
Можно ставить через MTRR, но там на порядок больше траха :)
Если всегда страничный режим, то через PAT, эти самые биты PAT/PCD/PWT в описании страницы ... Их сумма - индекс в отдельном MSR, где можно прописать 8 типов кэша на выбор (обычно там стандартное значение). Подробнее см в "Memory Cache Control" у интела.

IA32_EFER не нужен, это всё доступно начиная с P3 по умолчанию.

В вышестоящих уровнях биты трогать не надо - только у самой страницы.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB