1

我正在尝试开发自己的概念验证操作系统。只是一些基础知识。我刚开始使用 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 个字符。

4

0 回答 0