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 个字节保持为零,但如果我将任何内容放入其中,即使设置了视频模式,它也能幸存下来。
...私有缓冲区...神秘字节...
这没有什么秘密。如果它看起来像线性帧缓冲区,如果它的功能像线性帧缓冲区,并且它位于您期望线性帧缓冲区的位置,那么它很可能是线性帧缓冲区。从今往后,我将其称为 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)处放置属性字节,但它至少与奇/偶方案有一些相似之处吗?
现在,在其他人提出更好的解释之前,您可以通过以下方式进一步调查问题: