【问题标题】:How to get VESA BIOS Information如何获取 VESA BIOS 信息
【发布时间】:2018-11-22 04:32:22
【问题描述】:

我正在关注Phil-Opp Tutorials 中关于用 Rust 编写操作系统的内容,在玩了一点之后,我想在屏幕上显示真实的图形。

我发现我可能应该从使用带有 VESA 的线性帧缓冲区开始。我在 osdev.org herehere 上找到了一些教程,但他们一直在谈论“功能代码”和 es:di。第二个链接是这样说的:

功能:获取 VESA BIOS 信息

功能码:0x4F00

描述:返回VESA BIOS信息,包括制造商、支持的模式、可用的显存等...输入:AX = 0x4F00

输入:ES:DI = Segment:Offset 指向存储 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_structure,我会很高兴(我在 long mode 中运行)。

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

【问题讨论】:

  • BIOS 调用通常是通过将一个值放入寄存器并运行int 0x10 或其他一些中断来进行的。例如en.wikipedia.org/wiki/INT_10H 列出了不同的 AH 值。这些值是“功能代码”,例如在运行syscall 之前设置eax=__NR_write 的Linux 系统调用的系统调用号。
  • @PeterCordes 哦,我确实在文章中看到了一些关于 int 0x10 的内容。那么,如果我mov ax, 0x004f,运行int 0x10,那么它应该可以工作吗?我需要设置ES:DI吗?
  • 是的。在调用int 10h 之前,您需要将ES:DI 设置为指向一个512 字节的变量空间,该变量空间以上面定义的四个字节VBE2 开头。调用int 10h 后,结构将被数据填充。
  • @zx485 我把变量空间放在.bss吗?

标签: assembly x86 rust inline-assembly


【解决方案1】:

在您的 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 好点。 WRT保护模式:他可以在进入保护模式之前调用get_vesa_info,让事情变得更简单。
  • 要了解有关 VESA BIOS 的信息,您应该查看 RBIL (ctyme.com/intr/rb-0273.htm)
猜你喜欢
  • 2017-03-28
  • 2011-04-06
  • 1970-01-01
  • 2015-08-25
  • 2013-07-06
  • 2021-12-20
  • 2021-10-07
相关资源
最近更新 更多