Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Помогите организовать вывод в видеопамять  (Прочитано 38873 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dimedrol
Помогающий

ru
Offline Offline

« : 19-03-2005 18:19 » 

  Пока что сделал так - методом тыка определяю адрес выдеопамяти экрана (ищу с адреса 0xD0000000), дальше MmMapIoSpace  и вывожу в спроецированный адрес памяти. Вопрос такой: как цивилизованными средствами в драйвере узнать точный адрес поверхности экрана?
Может надо вообще пользоваться какими-либо другими способами(стандартными для этой ситуации)?
Заранее спасибо.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #1 : 23-03-2005 08:14 » 

А ты не пробовал адресацию через GS ?
Записан

while (8==8)
maaaaaad
Гость
« Ответ #2 : 23-03-2005 10:28 » 

а ты не пробовал сначала почитать DDI из DDK?
Записан
dimedrol
Помогающий

ru
Offline Offline

« Ответ #3 : 23-03-2005 18:50 » 

А ты не пробовал адресацию через GS ?
sss, поясни пожалуйста как надыбать нужный селектор, а то
GS=0 стандартно.

а ты не пробовал сначала почитать DDI из DDK?
maaaaaad, я никогда еще не пользовал DDI, попробую,
хотя с виду громоздко, без примеров не обойтись. Но прежде чем начать есть вопрос: вывод будет осуществляться при работающем полноэкранном Direct приложении (exclusive?) - это не
помешает прорисовке поверх него? (на обычных вин-аппликухах не работало)

PS
Блин, забыл уточнить - драйвер под XP пишу, но DDK только
2000 есть.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #4 : 24-03-2005 06:33 » 

- методом тыка определяю адрес выдеопамяти экрана (ищу с адреса 0xD0000000)
А адрес, который находил, меняется ?
Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #5 : 24-03-2005 09:21 » 

А адрес, который находил, меняется ?
Да, адрес зависит от настроения системы при включении,
но может менятся + пол экрана и при работе.

В связи с этим пожалуй отпадает неплохая идея о выводе на экран контрольной последовательности пикселов с последуюющим поиском ее в заданном диапазоне видеопамяти... Кроме того в момент работы фулскрина вывод на экран - еще одна проблеиа без решения..
« Последнее редактирование: 24-03-2005 09:37 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #6 : 25-03-2005 01:24 » 

А индекс в каталоге и таблице страниц ?
« Последнее редактирование: 25-03-2005 01:26 от sss » Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #7 : 25-03-2005 17:12 » 

Хм... данные адреса (0xD0000000-..), как виртуальные, указывают куда-то в оперативку, notpresent, те не имеют ничего общего с видеопамятью - надо мэпить, иначе BSOD:PAGE_FAULT_IN_NONPAGED_AREA. Для адреса промэпленного MmMapIoSpace индексы имхо абсолютно случайные, а сканирование всех таблиц каждой директории (4kb страницы) текущей задачи вообще не нашло попаданий в диапазон видеопамяти - опять-таки без мэпа не обойтись.
« Последнее редактирование: 25-03-2005 17:17 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #8 : 28-03-2005 04:02 » 

Не понял, ты находишь адрес видеобуфера и он находится в страничной памяти текущего процесса ? Причем не присутствует в памяти? А как ты идентифицируешь что это видеобуфер ?
Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #9 : 28-03-2005 14:04 » 

    Я не совсем понял про индескы какого именно адреса ты спрашивал.
 Сначала я сказал, что 0xD0000000 - это не виртуальный адрес видеобуфера, а физический (как виртуальный он указывает в караганду), поэтому его надо мэпить на виртуальное пространство, а для промэпленного для собственного пользования адреса индексы PDE, PTE
интереса не представляют. Потом подумал, что используемый видеодрайвером виртуальный адрес неким образом мог заваляться в станицах памяти текущего процесса... Но такого не оказалось.
   Так какой адрес имелся ввиду, и какую пользу может принести знание о том меняются ли для него индексы PDE, PTE?
« Последнее редактирование: 28-03-2005 14:07 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #10 : 29-03-2005 08:39 » 

Тогда я не понял твой вопрос. Мне показалось, что ты ищешь с линейного (!) адреса 0xD0000000 и находишь  (как я понял) видеобуффер где то  дальше (всегда по разному)? Я не правильно понял ?
Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #11 : 29-03-2005 10:09 » 

  Не, ты все понял правильно: ищу с линейного и нахожу где-то дальше... Просто я не понял для какого адреса ты предлагал поглядеть PDE, PTE - это ли неизвестный, но возможный мэп физического адреса видеобуфера на какой либо виртуальный для данного процесса или промэпленный мной найденный адрес видеобуфера? Дальше все варианты перебрал...
  А 0xD0000000 - это так, для примера, не говорить же каждый раз "некий адрес видеобуфера экрана найденный начиная с физического адреса 0xD0000000"
« Последнее редактирование: 29-03-2005 10:19 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #12 : 30-03-2005 00:45 » 

Хорошо, теперь, как ты ищешь видеобуфер. Делаешь примерно так ?

Код:
PHYSADDR = 0xD0000000;
SIZE = 800 * 600 * 4;

do
{
  MmMapIoSpace(PHYSADDR, SIZE, ...);
  fRes = find(MmMapIoSpace(PHYSADDR, SIZE, ...));
  PHYSADDR += SIZE;
  MmUnmapIoSpace(...);
}
while (!fRes);

P.S: Я бы просто искал видеобуфер в линейных адресах!
« Последнее редактирование: 30-03-2005 00:48 от sss » Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #13 : 30-03-2005 08:13 » 

Есть такие способы:
1) Самый варварский. Выбираю наугад некий адрес в диапазоне видеопамяти
пусть тотже 0xD0000000, дальше пытаюсь туда что-то вывести, например:
Код:
PHYSICAL_ADDRESS ph;
LPDWORD pv;
ph.QuadPart = 0xD0000000;
    pv = (LPDWORD)MmMapIoSpace(ph, 0x1000,..);
for(int i=0; i< 0x400; i++)
pv[i] = 0xFFFFFF; //white fill
UnmapIoSpace(...);
контролирую на экране, если не вывелось - увеличиваю адрес скажем на
0x100000 и повторяю, если вывелось - подгоняю адрес более точно (он
всегда выровнен на 4 кб страницу).
2) Более цивилизованный. Вывожу в верхний левый угол экрана цепочку
пикселов(SetPixel(..)), а потом нечто похожее на твой пример:
Код:
#define PAGE 0x1000
#define MAX_RANGE 0xDFFFF000

PHYSICAL_ADDRESS ph;
LPDWORD pv;
bool found = false;
ph.QuadPart = 0xD0000000-0x1000;
while ((!found) &&(ph.QuadPart < MAX_RANGE))
{
ph.QuadPart += PAGE;
found = find((pv = MmMapIoSpace(ph, PAGE, ..)));
//find searches DWORD string
UnmapIoSpace(pv,PAGE);
}
if(found)
{
...
}
Да, насчет твоего примера: вовсе не факт, что начало видеобуфера
выровнено на 800*600*4 (например было как-то 0xD0BE0000), более того в
режиме 800х600 у меня есть заэкранная память - длинна одной линий экрана
не 0х320 = 800 пикселов, а 0х340.
P.S: Я бы просто искал видеобуфер в линейных адресах!
Попробую еще MmGetPhysicalAddress-ом виртпамять посканировать (PDE PTE вроде ничего не давали, но может не учел чего..), может чего где завалялось интересного. Однако не факт, что он там может быть.
« Последнее редактирование: 30-03-2005 08:59 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
dimedrol
Помогающий

ru
Offline Offline

« Ответ #14 : 30-03-2005 09:37 » 

  MmGetPhysicalAddress дала результат! Но радости мало, тк на один кусок виртуального пространства 0xF1310000-0xF9310000 линейно cмэплены адреса 0xD0000000-0xD8000000. Тут и курсоры и внеэкранные поверхности - поди разберись где буфер экрана.. Жаль
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #15 : 31-03-2005 03:54 » 

Неправильно представляешь. Линейная память есть окно на физическую память (причем и внутри видеочипа)! Т.е. твоя задача состоит в том, что бы найти какие линейные (!) адреса использует система (и использует ли одни и те же) для доступа к видеобуферу. Попробуй вообще не использовать физическую память (зачем?).

P.S.: D8000000 - D0000000 = 128 МВ - размер памяти видеокарты однако ?
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #16 : 31-03-2005 04:04 » 

P.P.S: Смотри как Шрайбер делает проверки доступности линейного адреса.

Код:
BOOL skmdMemoryPageEntry (PVOID pVirtual,
PSKMD_PAGE_ENTRY pspe)
{
SKMD_PAGE_ENTRY spe;
BOOL           fOk = FALSE;

spe.pe       = X86_PDE_ARRAY [X86_PDI (pVirtual)];
spe.dSize    = X86_PAGE_4M;
spe.fPresent = FALSE;

if (spe.pe.pde4M.P)
{
if (spe.pe.pde4M.PS)
{
fOk = spe.fPresent = TRUE;
}
else
{
spe.pe    = X86_PTE_ARRAY [ X86_PAGE (pVirtual) ];
spe.dSize = X86_PAGE_4K;

if (spe.pe.pte4K.P)
{
fOk = spe.fPresent = TRUE;
}
else
{
fOk = (spe.pe.pnpe.PageFile != 0);
}
}
}
if (pspe != NULL) *pspe = spe;
return fOk;
}



// Тестирует виртуальный адрес на доступность
BOOL skmdMemoryTestAddress (PVOID pVirtual)
{
  return skmdMemoryPageEntry (pVirtual, NULL);
}

// Тестирует блок на доступность
BOOL skmdMemoryTestBlock (PVOID pVirtual,
                          DWORD dBytes)
 {
    PBYTE pbData;
    DWORD dData;
    BOOL  fOk = TRUE;

    if (dBytes)
        {
        pbData = (PBYTE) ((DWORD_PTR) pVirtual & X86_PAGE_MASK);
        dData  = (((dBytes + X86_OFFSET_4K (pVirtual) - 1)
                   / PAGE_SIZE) + 1) * PAGE_SIZE;
        do  {
            fOk = skmdMemoryTestAddress (pbData);

            pbData += PAGE_SIZE;
            dData  -= PAGE_SIZE;
            }
        while (fOk && dData);
        }
    return fOk;
 }

Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #17 : 31-03-2005 14:24 » 

Цитата: sss
P.S.: D8000000 - D0000000 = 128 МВ - размер памяти видеокарты однако ?
Да, но скорее апертуры AGP выставленной в BIOS.

Цитата: sss
Неправильно представляешь. Линейная память есть окно на физическую память (причем и внутри видеочипа)!
Это в смысле чип подозревает о линейных адресах и пользует их? Или часть физ.памяти проецируется на нутро видеочипа?
Если первое, то:
Pentium Developer's manual
Цитата
When a program (or task) references a logical address in memory, the processor translates the address into a linear address and then uses its paging mechanism to translate the linear address into a corresponding physical address.
(под "the address" тут понимается сегмент:смещение)Вот что я думаю по
этому поводу: виртуальный адрес никогда не покидает проц, а на шину адреса подается ФИЗИЧЕСКИЙ адрес.
На эту же шину средствами контроллера памяти (еще AGP) проецируются адреса Onboard памяти видюхи. Для использования системой они проец. в физические адреса выше потолка RAM, при необходимости обращения чипа к экстра памяти(текстуры из RAM згрузить) часть Onboard видеопамяти или адресной шины чипа видеоконтроллера ,посредством AGP контроллера, может быть спроецирована на RAM. Разве я не прав?

Цитата: sss
Т.е. твоя задача состоит в том, что бы найти какие линейные (!) адреса использует система (и использует ли одни и те же) для доступа к видеобуферу.Попробуй вообще не использовать физическую память (зачем?).

Это можно, но
Цитата: dimedrol
на один кусок виртуального пространства 0xF1310000-0xF9310000 линейно cмэплены адреса 0xD0000000-0xD8000000
т.е. разницы где искать мало. Но имхо лучше положится на заранее известные физ.адреса, чем на эфемерные линейные, выделенные ОСью по хотению левой пятки (вообще удача, что эти страницы там оказались), ладно бы проецировалось както хитро(с разрывами в физической памяти, перестановками страниц),тогда бы это имело смысл (и по размерам блоков можно былоб сделать определенные выводы), а так - тут 128Mb, там 128Mb... Главное, что фиг поймешь как там найти экранный видеобуфер.

Цитата: sss
P.P.S: Смотри как Шрайбер делает проверки доступности линейного адреса.
Спасибо за пример. Я уже похоже делал, впрочем результат один:
0xF1310000-0xF9310000 полностью доступны без ограничений.
« Последнее редактирование: 20-12-2007 19:20 от Алексей1153++ » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #18 : 01-04-2005 00:50 » 

Скажи, откуда у тебя уверенность, что физические адреса (тем более внешних устройств разных вендоров)  в системах с разными типами и размерами физической памяти заранее известны ? Скорее всего, для совместимости, ОС всегда будет их маппить в одно и то же линейное окно. Хотя бы потому, что для видео карт производители пишут мини-драйверы опирающиеся на классовый драйвер от Microsoft (вообще посмотри эту тему плотнее). А еще лучше проведи поиск в разных ОС и на разных компьютерах с разным количеством памяти. Это тебе даст более точный ответ чем я.
Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #19 : 01-04-2005 09:43 » 

Цитата: ss
Скажи, откуда у тебя уверенность, что физические адреса (тем более внешних устройств разных вендоров)  в системах с разными типами и размерами физической памяти заранее известны ?
Да, с этим, признаюсь, загнул. Но все-таки их определение особого труда не составляет, тк можно либо просто посмотреть ранги в конфигурационном пространстве PCI, либо на худой конец открыть какой-нибудь System Information.
Цитата: sss
Скорее всего, для совместимости, ОС всегда будет их маппить в одно и то же линейное окно. Хотя бы потому, что для видео карт
производители пишут мини-драйверы опирающиеся на классовый драйвер от Microsoft (вообще посмотри эту тему плотнее).
Наверно так оно и есть, только скорее всего этим в основном BIOS занимается, а ОС потом уж почти ничего не делает. Впрочем, не в этом то проблема.
Цитата: sss
А еще лучше
проведи поиск в разных ОС и на разных компьютерах с разным количеством памяти. Это тебе даст более точный ответ чем я.
На старом системнике уже пробовал - не совпадают...

Сейчас главная проблема идентифицировать внутри известного ранга виртуальной(или физической) памяти экранный буфер.
Интересно, помнится писал прогу под DOS, переходящую в защищенный режим и рисующую в нем на экран, так там определял начало линейного буфера экрана по VESA Int10, AX=0x4F00, ES:DI - buffer, после вызова в буфере+28h он и находился. Нашел в DDK :
Код:
VP_STATUS VideoPortInt10(IN PVOID  HwDeviceExtension,IN PVIDEO_X86_BIOS_ARGUMENTS  BiosArguments);
C первым параметром что делать не знал, этот эктеншн видно только в видеоминидрайверах, потому:
Код:
char Ext[1000];
VideoPortInt10(&Ext[0], &regs);
Как ни странно-работало:-) Но оказалось, что в Int10 нельзя передавать указатели на память и попробовать тот самый VESA Int10 не получилось..
 Еще, буфер всегда был в начале диапазона адресов видеопамяти 0xD0000000! Видимо
это по умолчанию при включении. Каким же образом система смещает это адрес? Нашел вот чего-то про AGP и GART(Graphic address remapping table) в DDK, оказалось что есть помимо вирт.памяти есть еще одно страничное преобразование из физической памяти в Onboard видеоадреса. Если Onboard памяти видеобуфер начинается с фиксированного адреса(0?) а лишь потом поецируется,скажем в 0xD0ВE0000, то поимев эту GART легко найти то что надо! Но я не представляю как это сделать.. Все что знаю: GART лежит в физической RAM, мамять под нее выделяется  MmAllocateContiguousMemory  в ранге 0..((DWORD)-1)
(Это пример из DDK - agp440). Конечно возможно GART здесь и ни причем, а ScreenBufferAddr лежит в каком-нибудь регистре видеоконтроллера...
   Еще нашел IOCTL_VIDEO_SHARE_VIDEO_MEMORY запрос для драйвера минипорта, вродеб это в тему.. Но вызвать драйвер минипорта не удалось - судя по всему он не имеет именованного девайса и его хэндл знает лишь система,которая передает его Display Driver
при инициализации.
 Как же быть? Есть идеи?
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
dimedrol
Помогающий

ru
Offline Offline

« Ответ #20 : 02-04-2005 11:34 » 

Мда, на счет GART я похоже наврал - она мэпит AGP память(0xF0000000-..) на физические адреса, при этом окно для доступа к видеопамяти (D0000000-D8..)остается доступным и наверно линейно проецируется на видеопамять. Что такое есть эта AGP память(апертура) и как она соотносится с видеопамятью я как-то не понял. GART оказалась при обычной работе в Windows вообще отключена (регистры базового адреса и флаги описываются в том-же Agp440, и лежат в конфиг.пространстве PCI для AGP: Bus=0 Slot=0). Так-что этот вариант наверно отпадает.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #21 : 04-04-2005 02:16 » 

Мда.. Дальше начинается специализация в которой я ноль. Извини ....
Слушай, как ты читаешь конфигурационное пространство устройства PCI ?
Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #22 : 04-04-2005 11:21 » 

Цитата: sss
Мда.. Дальше начинается специализация в которой я ноль. Извини ....
Да ладно, я там тоже ноль... Так, только - поковыряться слегка могу... Впрочем, если будут идеи высказывай, буду рад любой помощи.
По этому поводу наверно maaaaaad что-то шарит, но не видно его.
Цитата: sss
Слушай, как ты читаешь конфигурационное пространство устройства PCI ?
Функция HalGetBusData (HalGetBusDataByOffset еще), например так:
Код:
PCI_COMMON_CONFIG   Config;
     HalGetBusData(PCIConfiguration,
         0, //Bus number for AGP
         0, //Slot number for AGP
        (void*)&Config,
         sizeof(Config));
Перебирая BusNum, SlotNum можно найти усройство заданного класса и.т.д. Для записи есть
соот ветственно HalSetBusData. DDK пишет что функция вроде устаревшая, но имхо не стоит обращать на это внимание, мне кажется ее просто хотят перевести в разряд недокументированных.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #23 : 05-04-2005 01:14 » 

У тебя есть инфа по регистрам видеоконтроллеров с поддержкой AGP ?
Есть у них какая нибудь общая спецификация ? Я ковырял видеоконтроллеры давным давно. Еще VGA. И помню была возможность изменения стартового адреса видеобуфера через его регистры . Возможно и в современных видеоконтроллерах есть такая возможность. Вот только насколько универсальна ?

А на счет конфигурационного пространства, я подумал, а вдруг читаешь без вызова HAL? Например через "PCI configuration address register"...



 
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #24 : 05-04-2005 01:17 » 

P.S.: У меня тут "PCI configuration space map" от какой то матери, AGP connector BUS = 01,  DEVICE = 00, FUNCTION = 00
Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #25 : 05-04-2005 16:02 » 

Даа.. В любом случае лучше сначала поискать на шине.
Цитата: sss
А на счет конфигурационного пространства, я подумал, а вдруг читаешь без вызова HAL? Например через "PCI configuration address register"...
Тогда понятно... Инфой по регистрам PCI даже не располагаю, максимум что делал это вызывал Int 1A BIOSa через точку входа для защищенног режима.
Вообще есть какие-нибудь стандарты PCI свободные для скачивания?
Цитата: sss
У тебя есть инфа по регистрам видеоконтроллеров с поддержкой AGP ?
Есть у них какая нибудь общая спецификация ?
Инфы нету, а насчет спецификаций есть отдельно по AGP (Можеь еще и в VESA есть?) AGP2.0 AGP3.0:
http://osdev.ru/files/hard/agp20.zip, http://www.intel.com/technology/agp/dowloads/agp30_final_10.pdf.
Правда последняя ссылка почему-то выводит на PCI-E.. AGP2.0 поглядел - мало полезного.
Инфу по регистрам видеоконтроллеров можно попробовать поискать в линуксовых сорцах. По регистрам управления AGP на Intel 440 я глядел DDK: src/kernel/agp, там в хедерах есть.
Цитата: sss
Я ковырял видеоконтроллеры давным давно. Еще VGA. И помню была возможность изменения стартового адреса видеобуфера через его регистры . Возможно и в современных видеоконтроллерах есть такая возможность. Вот только насколько универсальна ?
Такая возможность несомненно есть и мой случай тому подтверждение. Насчет стандартизованности сомневаюсь, впрочем глядеть надо..
« Последнее редактирование: 05-04-2005 16:18 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
dimedrol
Помогающий

ru
Offline Offline

« Ответ #26 : 05-04-2005 19:37 » 

Качнул спецификацию VESA 3.0 с http://osdev.ru/files/Hard/vbe3.zip (заодно нашел там про PCI), там есть VESA функция 07 Int10h - Get/Set display start! Плохо то, что ее нельзя вызвать из 32 bit защищенного режима именно для возвращения значения. Надо чтоли найти точку входа в нее, сдампить BIOS, отдизасмить его да глянуть какие регистры там пользуются.. Не переходить же в другой режим для этого..
« Последнее редактирование: 05-04-2005 21:53 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
dimedrol
Помогающий

ru
Offline Offline

« Ответ #27 : 06-04-2005 15:59 » 

Не зря биос дизасмил! Вот простая последовательность для получения(и установки) смещения сринбуфера в видеопамяти:
В конфиг пространстве PCI видюхи читаем DWORD со смещением +14h - I/o registers base, дальше
Код:
mov dx, [ioregbase]
mov dl, 0              //xx00 - index register
in eax, dx
mov [old],eax
mov eax, 0x224     //internal register index
out dx, eax
mov dl, 4              //xx04 data register
in eax, dx              //get screen address
mov [scrnoffset],eax
mov dl, 0
mov eax, [old]
out dx, eax
все просто -регистр данных, индекса и индекс адресного регистра(воостановление xx00 наверно не обязательно?). Позже, скачав
исходник линуксового драйвера Radeon 128 c http://www.botchco.com/alex/radeon, я нашел, что эти регистры называются соответственно RADEON_MM_INDEX, RADEON_MM_DATA,
RADEON_CRTC_OFFSET. Cудя по всему они стандартные для всей линейки Radeon, тк подошли и к 9600. Большой минус - этот способ не пойдет на других чипсетах.. Надо искать более стандартные способы.

Как думаешь стоит делать ставку на Int10 func7 subfunc1? Просто protected mode вроде кончается на VBE3, а в real - имхо не дело это и нет гарантий что и он не кончится..
« Последнее редактирование: 06-04-2005 16:02 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #28 : 07-04-2005 01:21 » 

Думаю вообще не стоит рассчитывать на програмные прерывания. Кстати, насчет регистров Radeon, ты считывал значения "Base Address Registers" из PCI_CONFIG_SPACE ? Че там лежит ?
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #29 : 07-04-2005 02:12 » 

Позырь чего я со своей видео (из PCI_CONFIG_SPACE) выдернул...
Код:
***** Расшифровка заголовка не зависящего от типа *****
VendorID = 0x10DE
DeviceID = 0x0111
Command = 0x0007
Status = 0x02B0
RevisionID = 0xB2
ProgIf = 0x00
SubClass = 0x00
BaseClass = 0x03
CacheLineSize = 0x00
LatencyTimer = 0xF8
HeaderType = 0x00
BIST = 0x00
***** Расшифровка заголовка типа 0 *****
BaseAddressRegister0 = 0xDE000000
BaseAddressRegister1 = 0xD0000008
BaseAddressRegister2 = 0x00000000
BaseAddressRegister3 = 0x00000000
BaseAddressRegister4 = 0x00000000
BaseAddressRegister5 = 0x00000000
Reserved1[0] = 0x00000000
Reserved1[1] = 0x00000000
ROMBaseAddress = 0x00000000
Reserved2[0] = 0x00000060
Reserved2[1] = 0x00000000
InterruptPin = 0x01
MinimumGrant = 0x05
MaximumLatency = 0x01
***** Двоичный дамп *****
00: 0xDE 0x10 0x11 0x01 0x07 0x00 0xB0 0x02
08: 0xB2 0x00 0x00 0x03 0x00 0xF8 0x00 0x00
10: 0x00 0x00 0x00 0xDE 0x08 0x00 0x00 0xD0
18: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
20: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
28: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
30: 0x00 0x00 0x00 0x00 0x60 0x00 0x00 0x00
38: 0x00 0x00 0x00 0x00 0x0B 0x01 0x05 0x01
40: 0x00 0x00 0x00 0x00 0x02 0x00 0x20 0x00
48: 0x17 0x00 0x00 0x1F 0x04 0x01 0x00 0x1F
50: 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x00
58: 0xCE 0xD6 0x23 0x00 0x0F 0x00 0x00 0x00
60: 0x01 0x44 0x02 0x00 0x00 0x00 0x00 0x00
68: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
70: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
78: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
80: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
88: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
90: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
98: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
A0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
A8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
B0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
B8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
C0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
C8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
D0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
D8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
E0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
E8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
F0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
F8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

Обрати внимание на BaseAddressRegister0...
В DeviceManager-e:
Resource setting->
Memory Range = DE000000 - DEFFFFFF
Memory Range = D0000000 - D7FFFFFF


DEFFFFFF - DE000000 = 16 МБ
D7FFFFFF - D0000000 = 128 МБ

Видеопамять карты 32 МБ. (16 МБ - Видеостраница ? DE000000 - начало активной видеостраницы ?)
Посмотреть АGP apperture size щас не могу (128 MB ?) (гребаный сервер нельзя перегружать ).

Тогда что такое BaseAddressRegister1 = 0xD0000008 ?
« Последнее редактирование: 07-04-2005 02:54 от sss » Записан

while (8==8)
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines