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)
复制到控制台的实际位置。这将允许我在早期模式下实现多个控制台,以便于我进行调试(以 screen
或 tmux
的方式)。
所以,我真的有 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。
我目前正在为 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)
复制到控制台的实际位置。这将允许我在早期模式下实现多个控制台,以便于我进行调试(以 screen
或 tmux
的方式)。
所以,我真的有 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。