如何获取 VESA BIOS 信息

2024-04-28

我正在跟踪Phil-Opp 教程 https://os.phil-opp.com/关于用 Rust 编写一个操作系统,在稍微尝试了一下之后,我想在屏幕上显示真实的图形。

我发现我应该从使用带有 VESA 的线性帧缓冲区开始。我在 osdev.org 上找到了一些教程here https://wiki.osdev.org/User:Omarrx024/VESA_Tutorial and here https://wiki.osdev.org/Getting_VBE_Mode_Info,但他们继续谈论“功能代码”并且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" ; indicate support for VBE 2.0+ .table_data: resb 512-4 ; reserve space for the table below

虽然我看过一些汇编语言教程,但我不知道什么是“功能代码”。据我了解,如果我mov ax, 0x4f00,并创建一个像上面这样的结构,它会神奇地覆盖该结构,然后我可以将其作为参数传递给我的 Rust 代码?我该如何或者我需要设置我的es:di? (通过研究,我认为它只是在现代处理器上自动设置的)

我应该在内联汇编中完成所有这些事情吗?我应该只使用 UEFI 并重写我的内核吗?如果您能给出如何在 Rust 代码中访问 vbe_info_struct 的示例(我正在运行),我会很高兴long mode).

这是我的boot.asm到目前为止,文件还没有工作:https://gist.github.com/nebrelbug/5a0042d4de32f942bb72e71fe282bdd2 https://gist.github.com/nebrelbug/5a0042d4de32f942bb72e71fe282bdd2。谢谢!


在 boot.asm 文件中,您有:

get_vesa_info:
    mov ax, 0x4f00
    mov [es:di], vbe_info_structure
    int 0x10
    ret

第三行必须替换为

    mov di, vbe_info_structure

解释:就像现在一样,它尝试在 es:di 指向的地址写入常量 vbe_info_struct (在您的情况下未定义)。相反,您想要的是将地址 vbe_info_struct 加载到 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 之前完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 VESA BIOS 信息 的相关文章

随机推荐