Где можно раздобыть информации по этой теме ? Сам искал не нашел ничего толкового, пытался методом тыка - результат нулевой все попытки окончились ресетом
MegaI2 Не, ты первый спрашиваешь объэтом. Работа с графикой в PM, делается прямым выводом в видео память. Вывод осуществляется в LFB. Установка видео режима делается в реальном или виртуальном режиме через vesa. У Зубкова был пример.
прямой вывод в видеопамять.. только вот придется писать минидрова для видеокарточек, ибо насколько я понял, для каждой карточки адрес начала видеобуффера вычисляется по-своему. если интересно, посмотри как реализованы драйвера минипорта для видеокарт в Windows, там в одном из мест в HwDeviceExtension записывается адрес начала фреймбуффера, который вычисляется динамически на основе характеристик карты. вообще я как раз этой темой щас занимаюсь глубоко.. правда не в голом PM, а под Windows в режиме ядра. Основной алгоритм - получаем у драйвера минипорта физадрес фреймбуффера, ну точнее уже промаппленый на виртуальное АП, но через секцию PhysicalMemory, это мне не катит, поэтому я перемапирую через MmGetPhysicalAddress/MmMapIoSpace, и дальше напрямую записываем в эту память. Уже написал семейство базовых функции для работы с графикой типа BitBlt, FillRect и прочих вплоть до вывода графических файлов и текста с помощью шрифтов. ADD: Pavia опередил :P
Great Можно, через VESA узнать адресс. Я постил код который находит адресс видео памяти через PCI в 99% должен работать. http://forum.codenet.ru/showpost.php?p=202118&postcount=27
Pavia о спасибо за код. надо попробовать ради интереса.. в принципе меня существующий мой код получения адреса через IOCTL_VIDEO_MAP_VIDEO_MEMORY / MmGetPhysicalAddress устраивает, но и другой вариант тоже не помешает)
MegaI2 Вот держи стандарт на VESA http://www.vesa.org/public/VBE/vbe3.pdf Функция 01. Возращает инвормацию о режиме и адресс видео памяти PhysBasePtr.
Pavia спасибо а запись простым mov'ом и эквивалентными коммандами ? ещё бы хотелось узнать про текстовый видеобуфер что-то не пойму какие коды он принимает
Кстати я тут слегка покопал насчет PCI и её конфигур пространства, получился такой кодес (аналог кода Pavia, только на си): http://www.everfall.com/paste/id.php?nn8vuab14hrr
почитал инфу про VBE 3.0 что то меня копирование и использование биоса не порадовало есть ещё варианты
ой я тут еще накопал из спецификации PCI Local Bus 2.2 насчет получения размера фреймбуффера - нужно дополнить тот код: Код (Text): PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0x10 + i) ); PCI_SET_DATA( 0xFFFFFFFF ); ULONG size = PCI_GET_DATA(); PCI_SET_DATA( tmp ); size = (~(size & 0xFFFFFFF0)) + 1; то есть результирующий код выглядит так: Код (Text): ULONG GetVideoAdapterLFBPhysAddress(USHORT VidAdapter, ULONG *size) { // Get configuration space data at address 0x00 [DevId VenId] PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0) ); ULONG tmp = PCI_GET_DATA(); USHORT VenId = (USHORT)(tmp&0xFFFF); if( VenId == 0xFFFF ) { PCI_SET_ADDRESS( PCICONF_ADDRESS(0,0,0,0) ); return 0; } // Read BARs for( int i=0; i<6; i++ ) { PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0x10 + i) ); PCI_BAR bar; tmp = PCI_GET_DATA(); *(ULONG*)&bar = tmp; if( bar.m.IoOrMemorySpace == 0 ) { // Memory-Space BAR if( bar.m.Type == PCI_BAR_MEM_TYPE_32BIT ) { // 32-bit Memory-Space BAR; LFB phys. address // get LFB size. write -1 and read value. bits that are don't-care will be set to 0. PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0x10 + i) ); PCI_SET_DATA( 0xFFFFFFFF ); *size = PCI_GET_DATA(); PCI_SET_DATA( tmp ); *size = (~(*size & 0xFFFFFFF0)) + 1; // LFB size PCI_SET_ADDRESS( PCICONF_ADDRESS(0,0,0,0) ); return (tmp & 0xFFFFFFF0); } } } PCI_SET_ADDRESS( PCICONF_ADDRESS(0,0,0,0) ); return 0; }
MegaI2 Непонял, что куда копировать? Не хочешь биос использовать исполльзуй драйвер ОС. Если пишешь свою, то придеться для каждой видюшки свой драйвер писать. Great Про определения размера я знаю. А вот тебе не мешает выяснить про бит 3 BAR регистра -Prefetchable. Он позволяет отделить собственно памяти видео карты, от регистров отоброженных ввидео память.