我正在尝试开发自己的概念验证操作系统。只是一些基础知识。我刚开始使用 vbe 进行图形处理。我遇到的一个问题是获得支持的视频模式。经过深入研究,我发现 vbe get bios information (ax=4f00 int 10) 我实现它如下
这是真实模式
mov ax, 0
mov es, ax
mov ax, [vbe_info_structure]
mov di, ax
mov ax, 0x4f00
int 0x10
cmp ax, 0x004F
jne notOK
并在实模式下声明如下 vbe_info 结构
vbe_info_structure:
.signature db "VESA" ; indicate support for VBE 2.0+
.table_data: resb 512-4 ; reserve space for the table below
然后我将它的地址作为这样的参数传递给我的内核(32 BIT !!!)
mov eax, [vbe_info_structure]
push eax
call _kmain
我的简单内核代码是这样的(32 BIT)
struct VbeInfoBlock {
char VbeSignature[4]; // == "VESA"
uint16_t VbeVersion; // == 0x0300 for VBE 3.0
uint16_t OemStringPtr[2]; // isa vbeFarPtr
uint8_t Capabilities[4];
uint16_t VideoModePtr[2]; // isa vbeFarPtr
uint16_t TotalMemory; // as # of 64KB blocks
} __attribute__((packed));
int kmain(struct VbeInfoBlock *vbeinfo)
{
init_idt();
SetPITSpeed(100);
init_DTCursor();
printf(vbeinfo->VbeSignature[0]);
while(1);
}
来自 printf 的例外输入应该是“V”,但我得到了 junk S 和一些 ascii junk 只有 2 个字符。