我想写一个操作系统(小,更多用于练习)并遇到了一些困难。现在我有了加载程序文件、内核和未开发的 C 语言标准库的类似物。系统本身是用 NASM 和 C 编写的。我能够将代码文件编译为对象(.o 文件)并将所有内容链接到二进制文件中,甚至能够运行它。但有一个问题。在加载程序代码中,我调用 kernel_main,逻辑上它应该将测试消息打印到控制台,但这并没有发生。我应该更改什么才能使其正常工作(输出文本)? QEMU 模拟器只显示黑屏。 GitHub 上的代码链接:https://github.com/AverageOdin698/IN_OS。 P.S 抱歉英语不好。我用的是翻译机。 P.P.S 这段代码部分是在 ChatGPT 的帮助下编写的。
在回答之前,我强烈建议您查看 OSDev wiki (https://wiki.osdev.org/Expanded_Main_Page)。目前首先想到的是“video”易失变量的数据类型:
volatile char *video = (volatile char*) 0xB8000;
//Newly
volatile uint16_t* video = (volatile uint16t*) 0xB8000;
并使用新的数据类型正确解析颜色和字符:
//mapping function
static inline uint16_t vga_entry(unsigned char uc, uint8_t color)
{
return (uint16_t) uc | (uint16_t) color << 8;
}
void putchar(char c){
// ...
//OLD :
video[offset] = c; // Символ
video[offset + 1] = 0x07;
//NEW
video[offset++] = vga_entry(c, 0x07);
}
这可能是解决问题的切入点,查看 OSDev wiki 来修改代码架构可能会很有用(r.f.:https://wiki.osdev.org/Bare_Bones)