如何获取VESA BIOS信息

时间:2018-06-12 17:42:06

标签: assembly x86 rust inline-assembly

我正在跟踪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" ; indicate support for VBE 2.0+ .table_data: resb 512-4 ; reserve space for the table below

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

我应该在Inline Assembly中完成所有这些工作吗?我应该只使用UEFI并重写我的内核吗?如果您能举例说明如何在Rust代码中访问vbe_info_structure(我正在long mode中运行),我很乐意。

到目前为止,这是我的boot.asm文件,但它尚未运行:https://gist.github.com/nebrelbug/5a0042d4de32f942bb72e71fe282bdd2。谢谢!

1 个答案:

答案 0 :(得分:0)

在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_structure。相反,您想要的是将地址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加载到斧头之前完成。