VESA/VGA 早期内核控制台中字符结构的正确形式是什么?

What is the correct form for a Character struct in a VESA/VGA early kernel console?

我目前正在为 x86 开发内核(只是为了好玩)。我正在尝试实现一个相当有用的早期控制台,以报告驱动程序的加载情况,并允许我在需要时在引导期间使用内存,使用位于 0xB8000 的 80x25 字符 VESA/VGA 控制台。我想用一个表示字符及其属性字节的结构来做到这一点。但是,我想知道如何正确格式化我的 Character 结构。我目前有:

#define CONSOLE_SIZE_X  80  //The length of a line in the console
#define CONSOLE_SIZE_Y  25  //The number of lines in the console
#define CONSOLE_MEMLOC  0xB8000 //The position of the console in system memory

#define ATTR_DEFAULT    0x07 //DOS Default
#define ATTR_ERROR  0x1F //BSOD Colors
#define ATTR_PHOSPHOR   0x02 //"Phosphor" colors, green on black

typedef struct {
    char character = (char) 0x0000;
    char attribute = (char) 0x0000;
} Character; //A VESA VGA character

typedef struct {
    int pos_x = 0;
    int pos_y = 0;

    char defaultAttrib = ATTR_DEFAULT;

    Character buffer[CONSOLE_SIZE_Y][CONSOLE_SIZE_X];


} VESAConsole;

VESAConsole 结构仅用于逻辑目的(即它不代表 RAM 中任何重要的位置集);它的 Character buffer[][] 将通过函数 cFlushBuffer(Character* console, Character* buffer) 复制到控制台的实际位置。这将允许我在早期模式下实现多个控制台,以便于我进行调试(以 screentmux 的方式)。

所以,我真的有 2 个问题:我的 Character 结构是否正确,以及在处理早期 VESA/VGA 控制台时是否有任何我需要注意的陷阱?

首先是的,假设没有填充,你的 Character 结构是正确的。

然后至于陷阱,有两种情况:

  • 要么你使用了一些已知的好代码来设置 VGA 硬件(例如,要求 BIOS 这样做,要求 GRUB 这样做,从另一个 OS 中拿了一个例子,。 ..),
  • you did the hardware setup yourself.

在第一种情况下,您可以开始了。一旦设置正确完成,就没有任何真正邪恶的陷阱。直接写入内存,让硬件处理即可。

在第二个方面,事情出错的方式(几乎)有无数种。众所周知,图形硬件很难设置,尽管与现代图形卡使用的 VGA 相比微不足道,但它仍然远非易事。

可能的副作用包括但不限于黑屏、崩溃、燃烧 and/or CRT 显示器爆炸等。

如果您有兴趣进一步阅读,不妨看看 the various resources on the OSDev Wiki