我正在跟随Phil-Opp Tutorials关于在Rust中编写操作系统的教程,并且在玩弄一下后,我想尝试在屏幕上显示真正的图形。
我已经想到应该从使用带有VESA的线性帧缓冲开始。我在osdev.org上找到了一些教程here和here,但它们不断谈论“函数代码”和
功能:获取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 ; 保留以下表的空间
虽然我看过一些汇编语言教程,但我不知道什么是“函数代码”。据我所知,如果我执行
我应该在内联汇编中完成所有这些工作吗?我应该只使用UEFI并重写我的内核吗?如果您能举例说明如何在Rust代码中访问vbe_info_structure,那就太好了(我正在运行
这是我的
我已经想到应该从使用带有VESA的线性帧缓冲开始。我在osdev.org上找到了一些教程here和here,但它们不断谈论“函数代码”和
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。谢谢!
int 0x10
或其他中断来实现的。例如,https://en.wikipedia.org/wiki/INT_10H列出了不同的AH值。这些值是“函数代码”,就像Linux系统调用的系统调用号码一样,在运行`syscall`之前设置`eax=__NR_write`。 - Peter Cordesint 10h
之前,您需要将ES:DI
设置为指向从上面定义的四个字节VBE2
开始的512字节变量空间。调用int 10h
后,该结构将被填充数据。 - zx485vbe_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 Gublersection.data:
Ithink was meant to besection .data
- Michael Petch