在VGA文本模式下,Intel GMA950专用缓冲区中字节的含义

时间:2016-03-28 19:05:14

标签: assembly intel osdev vga video-memory

在文本屏幕(模式3,80x25)上工作时,B800h的常用视频缓冲区和4GB地址空间末端附近的线性帧缓冲区(LFB)都处于活动状态。我发现对于显示器上的每个字符单元格,LFB使用 8字节。第一个字节(a)代表ASCII,第二个字节(b)代表属性。

在空白显示页面上,这8个字节如下所示:

20h,07h,00h,00h,00h,00h,00h,00h
(a) (b) (c) (d) (e) (f) (g) (h)    

有谁知道额外的6个字节用于什么?我观察到只有这些神秘字节的第一个(c)和第五个(g)实际上是用我看起来随机的值刷新的。其他4个字节保持为零,但如果我在其中放入任何内容,它甚至可以在视频模式设置中存活。

2 个答案:

答案 0 :(得分:3)

当GMA950以文本视频模式运行时,图形内存被组织为双字列表。每个双字的第1个字节与显示平面0中的字节匹配,每个双字的第2个字节与显示平面1中的字节匹配,依此类推......

可以有8个显示页面。

GM + 00000000h : Display page 0
GM + 00004000h : Display page 1
GM + 00008000h : Display page 2
GM + 0000C000h : Display page 3
GM + 00010000h : Display page 4
GM + 00014000h : Display page 5
GM + 00018000h : Display page 6
GM + 0001C000h : Display page 7

可以加载8种字体。

GM + 00000000h : Font block 0
GM + 00008000h : Font block 4
GM + 00010000h : Font block 1
GM + 00018000h : Font block 5
GM + 00020000h : Font block 2
GM + 00028000h : Font block 6
GM + 00030000h : Font block 3
GM + 00038000h : Font block 7

这是使用图形内存的前12个字节的方式:

 /------------------------------------------------> character code 1st cell
 |   /--------------------------------------------> attribute byte 1st cell
 |   |   /----------------------------------------> 1st bit pattern 1st ascii
 |   |   |   /------------------------------------> unused (a)
 |   |   |   |   /--------------------------------> unused (b)
 |   |   |   |   |   /----------------------------> unused (b)
 |   |   |   |   |   |   /------------------------> 2nd bit pattern 1st ascii
 |   |   |   |   |   |   |   /--------------------> unused (a)
 |   |   |   |   |   |   |   |   / ---------------> character code 2nd cell
 |   |   |   |   |   |   |   |   |   /------------> attribute byte 2nd cell
 |   |   |   |   |   |   |   |   |   |   /--------> 3rd bit pattern 1st ascii
 |   |   |   |   |   |   |   |   |   |   |   /----> unused (a)
 |   |   |   |   |   |   |   |   |   |   |   |
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h

(a)不使用这些字节,因为它们与未使用的位平面3匹配

(b)不使用这些字节是文本视频模式中使用的奇数/偶数运算的必然结果,其中主机存储器中的2个连续字符代码占据显示器中连续的偶数地址记忆。由于标有(b)的字节对应于奇数地址,因此不使用它们。

答案 1 :(得分:2)

  

...私人缓冲区...神秘字节......

没有任何秘密可言。如果它看起来像一个线性帧缓冲区,并且它的功能类似于线性帧缓冲区,并且它位于您期望线性帧缓冲区的位置,则很可能它是一个线性帧缓冲区。从此以后我称之为LFB。

要获取GMA950上LFB的地址,您可以使用以下代码:

mov di, 0018h       ;Offset for GMADR
mov bx, 0010h       ;[15-8] Bus=0, [7-3] Device=2, [2-0] Function=0
mov ax, B10Ah       ;Read PCI dword
int 1Ah
and ecx, F0000000h  ; --> ECX is linear address of the LFB

在16色图形模式中,LFB的组织如下:

 --------------------------------- 1st byte of bit-plane 0
 |   ----------------------------- 1st byte of bit-plane 1
 |   |   ------------------------- 1st byte of bit-plane 2
 |   |   |   --------------------- 1st byte of bit-plane 3
 |   |   |   |   ----------------- 2nd byte of bit-plane 0
 |   |   |   |   |   ------------- 2nd byte of bit-plane 1
 |   |   |   |   |   |   --------- 2nd byte of bit-plane 2
 |   |   |   |   |   |   |   ----- 2nd byte of bit-plane 3
 |   |   |   |   |   |   |   |
00h,00h,00h,00h,00h,00h,00h,00h
(a) (b) (c) (d) (e) (f) (g) (h)

文本视频模式使用类似的组织,因此(c)和(g)处的字节与位平面2相关联,这意味着它们表示字符集的位模式。 过度使用位平面2进行字体操作的过程非常繁荣!
我不知道为什么英特尔选择不在(e)处放置字符代码或在(f)处放置属性字节,但它是否至少与Odd / Even方案有一些相似之处?

现在,除非其他人提出更好的解释,否则您可以通过以下方式进一步调查问题:

  • 写入所有可用的显示页面,并查看IGD放置字符代码和属性字节的位置。
  • 加载额外字体(通过BIOS)并查看IGD存储这些字体的位置。