在我的操作系统中加载 C 内核时出现问题 [已关闭]

问题描述 投票:0回答:1

我想写一个操作系统(小,更多用于练习)并遇到了一些困难。现在我有了加载程序文件、内核和未开发的 C 语言标准库的类似物。系统本身是用 NASM 和 C 编写的。我能够将代码文件编译为对象(.o 文件)并将所有内容链接到二进制文件中,甚至能够运行它。但有一个问题。在加载程序代码中,我调用 kernel_main,逻辑上它应该将测试消息打印到控制台,但这并没有发生。我应该更改什么才能使其正常工作(输出文本)? QEMU 模拟器只显示黑屏。 GitHub 上的代码链接:https://github.com/AverageOdin698/IN_OS。 P.S 抱歉英语不好。我用的是翻译机。 P.P.S 这段代码部分是在 ChatGPT 的帮助下编写的。

c assembly operating-system nasm osdev
1个回答
0
投票

在回答之前,我强烈建议您查看 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

© www.soinside.com 2019 - 2024. All rights reserved.