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

Sep*_*and 5 assembly intel osdev vga video-memory

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

在一个空的显示页面上,这 8 个字节看起来像:

20h,07h,00h,00h,00h,00h,00h,00h
(a) (b) (c) (d) (e) (f) (g) (h)    
Run Code Online (Sandbox Code Playgroud)

有谁知道额外的 6 个字节是做什么用的?我观察到只有这些神秘字节的第一个 (c) 和第五个 (g) 实际上刷新了对我来说似乎是随机的值。其他 4 个字节保持为零,但如果我将任何内容放入其中,即使设置了视频模式,它也能幸存下来。

Fif*_*nik 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
Run Code Online (Sandbox Code Playgroud)

在 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)
Run Code Online (Sandbox Code Playgroud)

文本视频模式使用类似的组织,因此 (c) 和 (g) 处的字节与位平面 2 相关联,这意味着它们代表字符集的位模式。麻烦地访问位平面 2 进行字体操作的日子已经一去不复返了!
我不知道为什么英特尔选择不在(e)处放置字符代码或在(f)处放置属性字节,但它至少与奇/偶方案有一些相似之处吗?

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

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