OSDev
http://osdev.su/

Как реализовать прокрутку vesa framebuffer`a?
http://osdev.su/viewtopic.php?f=6&t=1134
Страница 2 из 2

Автор:  thunderstruck [ 09 янв 2016, 22:26 ]
Заголовок сообщения:  Re: Как реализовать прокрутку vesa framebuffer`a?

pavia писал(а):
надо включить для видепамяти режим кэша Write Combining (WC)

А можно ссылку на пример реализации?

Автор:  pavia [ 09 янв 2016, 23:07 ]
Заголовок сообщения:  Re: Как реализовать прокрутку vesa framebuffer`a?

К примеру можно из колибриОС взять.
http://websvn.kolibrios.org/filedetails ... 0&peg=5360
http://websvn.kolibrios.org/revision.ph ... 1&rev=5360

Автор:  dixie [ 10 янв 2016, 22:10 ]
Заголовок сообщения:  Re: Как реализовать прокрутку vesa framebuffer`a?

Для таких вещей надо делать shadow буфер...
Т.е. копировать всё выводимое и на экран и туда, где должна получаться точная копия экрана. И при скроллировании или любом чтении с экрана использовать эту копию.

Поскольку копия в обычной памяти и на ней WB тип кэша - то работает она на порядок быстрее.

Что не отменяет, конечно, необходимости ставить Write Combine на видео - это ускоряет запись туда, тоже на порядки.

Автор:  Himik [ 17 мар 2016, 23:46 ]
Заголовок сообщения:  Re: Как реализовать прокрутку vesa framebuffer`a?

Регистры MTRR можно не мучить, достаточно настройки MSR PAT
Код:
#define MSR_IA32_CR_PAT 0x277
#define asm_rdmsr(ecx, eax, edx)  asm volatile("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx))
#define asm_wrmsr(ecx, eax, edx)  asm volatile("wrmsr" : : "c" (ecx), "a" (eax), "d" (edx))

   //Установить тип кэширования "write-combining" для ускорения видеопамяти.
   //Для этого устанавливаем регистр MSR PAT, элемент 1 (биты 8,9,10) значение 1
   //При использовании видеопамяти, виртуальная страница должна иметь атрибуты PAT=0, PCD=0, PWT=1.
   unsigned int eax, ecx, edx;
   if(CPUFeatures & 0x10000) //Проверка поддержки PAT в процессоре
   {
      ecx = MSR_IA32_CR_PAT;
      asm_rdmsr(ecx, eax, edx);
      ((UCHAR*)&eax)[1] = 1; //"write-combining"
      asm_wrmsr(ecx, eax, edx);
   }

Если в Си не спец, то ((UCHAR*)&eax)[1] буквально означает регистр AH.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/