如何获取VESA BIOS信息

14
我正在跟随Phil-Opp Tutorials关于在Rust中编写操作系统的教程,并且在玩弄一下后,我想尝试在屏幕上显示真正的图形。
我已经想到应该从使用带有VESA的线性帧缓冲开始。我在osdev.org上找到了一些教程herehere,但它们不断谈论“函数代码”和es:di。第二个链接说:
功能:获取VESA BIOS信息 功能代码:0x4F00 描述:返回VESA BIOS信息,包括制造商、支持的模式、可用视频内存等... 输入:AX = 0x4F00 输入:ES:DI = 段:偏移指向存储VESA BIOS信息结构的位置。 输出:AX = 成功时的0x004F,其他值表示不支持VESA BIOS。 无论如何,以上功能将返回以下结构并将其存储在ES:DI中,就像它们在进入时一样。在进入时,ES:DI应该包含指向以下结构的指针:
vbe_info_structure: .signature db "VBE2" ; 表示对VBE 2.0+的支持 .table_data resb 512-4 ; 保留以下表的空间
虽然我看过一些汇编语言教程,但我不知道什么是“函数代码”。据我所知,如果我执行mov ax, 0x4f00并创建一个类似上面的结构体,它将神奇地覆盖该结构体,然后我可以将其作为参数传递给我的Rust代码?我需要设置es:di吗?(从研究中,我认为它在现代处理器上只是自动设置)
我应该在内联汇编中完成所有这些工作吗?我应该只使用UEFI并重写我的内核吗?如果您能举例说明如何在Rust代码中访问vbe_info_structure,那就太好了(我正在运行long mode)。
这是我的boot.asm文件,但它还没有起作用:https://gist.github.com/nebrelbug/5a0042d4de32f942bb72e71fe282bdd2。谢谢!

BIOS调用通常是通过将一个值放入寄存器并运行int 0x10或其他中断来实现的。例如,https://en.wikipedia.org/wiki/INT_10H列出了不同的AH值。这些值是“函数代码”,就像Linux系统调用的系统调用号码一样,在运行`syscall`之前设置`eax=__NR_write`。 - Peter Cordes
1
是的。在调用 int 10h 之前,您需要将 ES:DI 设置为指向从上面定义的四个字节 VBE2 开始的512字节变量空间。调用 int 10h 后,该结构将被填充数据。 - zx485
@zx485 我尝试将我的vbe_info_structure放入我的引导代码中,但是它报错:error: operation size not specified src/arch/x86_64/boot.asm:143: warning: uninitialized space declared in non-BSS section .rodata': zeroing`。 - Ben Gubler
1
没有教程,但fpmurphy是UEFI开发的好博客 - zx485
section.data: Ithink was meant to be section .data - Michael Petch
显示剩余8条评论
1个回答

4
在你的boot.asm文件中,你有以下内容:
get_vesa_info:
    mov ax, 0x4f00
    mov [es:di], vbe_info_structure
    int 0x10
    ret

第三行必须被替换为:
    mov di, vbe_info_structure

解释:当前代码试图将常量vbe_info_structure写入由es:di指向的地址(在您的情况下未定义)。相反,您需要将vbe_info_structure的地址加载到di中,然后将其传递给int 0x10例程。
顺便说一下,int 0x10执行多个功能。为了告诉它要调用哪一个功能,您需要在ax寄存器中传递“功能代码”。可以将功能代码视为函数名称(汇编中没有名称,只有数字和地址)。
此外,您需要正确设置es。可以这样做:
push ds
pop es

假设ds已经指向section.data,或者使用汇编指令(assume es section.data?-我不确定,因为我很久没有使用汇编语言了)。 或者可能是这样的:
mov ax, @section.data
mov es, ax

当然,在将0x4f00加载到ax之前,应该完成以下操作。


@MichaelPetch 说得好。关于保护模式:他可以在进入保护模式之前调用get_vesa_info,以使事情变得更容易。 - memo
了解VESA BIOS,您应该查看RBIL(http://www.ctyme.com/intr/rb-0273.htm)。 - caylee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接