使用VESA获取平面内存帧缓冲区地址时,无法传递线性帧缓冲地址至VBE
VBE线性帧缓冲地址读取失败问题解决
问题核心
执行32位代码读取VBE模式信息块的线性帧缓冲地址(偏移0x28)并写入0x8000时,0x8000始终为0;但直接写入立即数0x12345能正常生效,说明写入操作本身没问题,问题出在16位模式下获取模式信息的环节。
排查与修复步骤
检查VBE函数调用是否成功
调用int 10h后必须验证返回值,只有ax等于0x4F才表示调用成功,否则模式信息块不会被正确填充:mov ax, 4F01h mov cx, 1000111000000010b ; 1024x768 16-bit color mov di, ModeInfoBlock xor bx, bx mov es, bx int 10h cmp ax, 0x4F ; 验证VBE调用结果 jne vbe_fail ; 失败则跳转至错误处理确认模式信息块的内存安全
确保ModeInfoBlock定义的偏移地址未被BIOS或其他代码覆盖,建议选择如0x1000这类远离MBR(0x7C00-0x7E00)和BIOS常用区域的位置:ModeInfoBlock equ 0x1000 ; 定义安全的偏移地址验证目标模式是否支持线性帧缓冲
不是所有VBE模式都支持LFB,需检查模式信息块偏移0x19(模式属性)的第7位是否为1:mov al, [es:di + 0x19] test al, 0x80 jz no_lfb_support ; 不支持LFB则跳转处理32位模式下正确访问物理地址
实模式下es=0,ModeInfoBlock的物理地址就是其偏移值,32位代码中直接访问该物理地址即可:; 假设ModeInfoBlock偏移为0x1000 mov eax, [0x1000 + 0x28] mov [0x8000], eax
内容的提问来源于stack exchange,提问作者Cursor
相关产品推荐
相关产品推荐

