Skip to content

屏幕黑下去,字还在 ​

收工的验证,咱们敲的还是那道老命令:

bash
cmake -B build && cmake --build build --target run

这回终端里等着咱们的,是这么几行:

text
[stage2] stack ok
A20 ok
E820: 7 entries
  #00 base=0000000000000000 len=000000000009FC00 type=1
  ...(七条,跟上一站一模一样)
VESA: VBE 0x0300 93 modes
VESA: 0x4144 1024*768*32 LFB
  fb 00000000FD000000 pitch 4096
[stage2] alive

咱们看到的图谱还是上一站那七行,内容一模一样了。中间的条目一条都没动过,新添的那三行 VESA 输出排在它们后面。host 那边也有一眼要看:ctest 的清单现在是五件,其中有两件都是出自 boot 的,test_vesa 的两个哨兵都在里面。

逐行认 ​

VESA: VBE 0x0300 93 modes。控制器把自报家门交了:VBE 3.0,模式列表里躺着九十三个号了。这就是 4F00 那一问的收条,也是咱们签了 VBE2 才换来的版本。签名忘写会怎么样,咱们在下面把它交代掉。

VESA: 0x4144 1024*768*32 LFB。咱们挑中的模式号是 0x144,或上 bit 14 之后递出去的就是 0x4144。宽、高、色深都是 ModeInfo 里问回来的原文,不是咱们从号里推出来的。末尾的 LFB 就是线性帧缓冲的记号,置上了 bit 14,显卡给咱们的才是一整块连续显存。

fb 00000000FD000000 pitch 4096。画布的物理地址和行距都到了咱们手里。眼尖的朋友看到 0xFD000000,可能会想起上一站的图谱:128MB 那一大片主存到此收住,0xFFFC0000 起头的 ROM 条目又接在后面,中间那一大段地址在七条图谱里一条条目都没有,显存映射就住在这么一个空洞里。上一站咱们立的保守口径在这里正好接上:图上没列出来的地址,咱们一概当不能用的。显存那一段也跑不掉的,它本来就不是能随便读写的 RAM。行距的 4096,咱们拿 1024 乘 4 恰好能得出来,不过咱们照样读的是字段,而不是自己算的乘法:今天它恰好整除,明天哪块卡补了个对齐,咱们算出来的就会错。

再往下就是 [stage2] alive 了。腔调还是老的,含义却是新的:它是在图形模式的世界上说的这句。咱们把模式切过去之后,BIOS 的文本输出就没了,图形模式里咱们一个像素都没画,那块屏上就是黑的。咱们手上跑的命令带了 -display none,所以窗口本来就不会开,能看见的只剩 debugcon 这一路了。当年头一遍的时候,屏幕一黑可就让笔者成了睁眼的瞎子,只能提着 GDB 把存档参数一个字段一个字段挖出来了。这一遍咱们不怕黑,因为打印全都从 debugcon 走掉了,咱们不靠屏幕一个字。当年挖出来的那些参数,如今就摆在了面板上这一行里头。

几处容易摔的地方 ​

读模式列表的那个循环里,0xFFFF 这个终止符是要认准的。它既是列表的收尾,也被咱们拿来当“还没挑中”的记号。咱们的循环里要是漏了判它,咱们读到列表尾巴还会接着往下问,后面的内存就被当成模式号,行为也没了谱。咱们的循环判了它,还配了 128 项的护栏,两头都堵上了。

VESA: 0x4144 1024*768*32 LFB 这一行里的 LFB,前提是模式号上置了 bit 14。SetVideoMode 里咱们把 kLinearFrameBufferFlag 或进了模式号,调用侧连惦记它的工夫都省了。可您哪天要是绕开这个函数自己填 BX,把它忘了,模式本身也照样是切得过去的,MatchesRequest 那一头也照样给咱们放行了,因为属性位说的是显卡的能力,它不随咱们的请求变化。掉进去的话,咱们手里的参数全对,画出来的图全歪:显存被切成了 64KB 的窗口,写像素写到一半就出了窗口,屏幕上什么都不是。

第一行 VESA: VBE 0x0300 93 modes 里的版本号,是 VBE2 签名换来的。咱们不写它,调用照样返回 0x004F 了,版本却停在了 1.2,列表也是空的,后面枚举的时候一个模式都问不着,最后就死在了 fail("VESA mode") 那一行上。报错离出问题的地方隔了整个枚举循环,回查的时候,嫌疑最重的就是这个签名。咱们把它写死在 QueryControllerInfo 的函数体里,就是为了让忘写这件事没有可能。

收工 ​

咱们回到 host 那边,把 test_host 的五件用例都跑过去了,ctest 清单里的 vesa 排在最后一条。

出了本站,咱们就要跟 16 位实模式的段:偏移世界道别了,下一站去搭自己的 GDT、进保护模式。真到了那边,BIOS 就喊不应了,好在咱们该问的,都问完了。

r05_long_mode-2-gfc5569b · fc5569b · 2026-10-01