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



我目前正在为x86开发内核(只是为了好玩)。我正在尝试实现一个相当可用的早期控制台,以报告驱动程序的加载情况,并允许我在启动过程中使用内存(如果需要),80x25个字符的VESA/VGA控制台位于0xB8000。我想用一个表示字符及其属性字节的结构来实现这一点。但是,我想知道如何正确格式化我的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中的任何重要位置集);其CCD_ 2将通过函数CCD_。这将使我能够在早期模式下实现多个控制台,以便于调试(以screentmux的方式)。

所以,我真的有两个问题:我的Character结构正确吗?在处理早期的VESA/VGA控制台时,我需要注意哪些问题吗?

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

至于gotchas,有两种情况:

  • 要么你使用了一些已知的好代码来设置VGA硬件(例如,让BIOS来做,让GRUB来做,从另一个操作系统中取一个例子,…)
  • 或者你自己做了硬件设置

在第一种情况下,你可以离开。一旦设置正确,就不会有任何真正邪恶的陷阱。只需直接写入内存并让硬件处理即可。

第二,事情可能出问题的方式(几乎)多种多样。众所周知,图形硬件很难设置,尽管VGA与现代图形卡相比微不足道,但它仍然远非易事。

可能的副作用包括但不限于空白屏幕、崩溃、CRT显示器燃烧和/或爆炸等。。

如果你有兴趣进一步阅读,你可能想看看OSDev Wiki上的各种资源。

最新更新