在编写内核时,是否可以使用stdio?

5
我需要构建一个操作系统,非常小而基础,实际上只有最少的功能,用C编写。
可能是一个CUI操作系统,它可以进行一些内存管理,并且至少有一个文本编辑器和计算器,这只是一个关于如何使代码完全直接控制硬件的实验。
但我仍然需要一个界面,它需要输入/输出函数,如printf(&args),scanf(&args)。现在我的基本问题是应该使用现有的标头还是从头开始编码,为什么?
如果你能提供任何帮助,我将不胜感激。
3个回答

3
首先,你不能链接到任何来自libc的内容...你需要从头开始编写所有代码。
现在,我曾经参与过微内核的开发,我不会使用实际的libc标准输入输出头文件,因为它们会混杂着很多额外的信息,这些信息对于你的操作系统要么是无关紧要的,要么会由于缺少定义而导致编译器错误。然而,我会保留这些标准函数的函数签名...所以最终你将拥有一个名为stdio.h的文件,但它将是一个非常简化的头文件,只包含你需要的基本最小要求和正确的标准I/O函数签名。
请记住,在后端,即在你的stdio.c文件中,你需要将这些函数指向自定义控制台驱动程序或其他类型的字符驱动程序以显示内容。或者,你可以将它们用作某些其他内核级别的显示打印例程的包装器。你还需要确保即使你在其他操作系统代码模块中使用#include <stdio.h>指令来访问这些打印函数,你也不会链接到libc。这可以使用gcc -ffreestanding来完成。

非常感谢您,但现在又给您添麻烦了...既然我知道您已经经历了所有这些,一旦我真正开始制作这个操作系统,我可以在遇到问题时向您请教吗 :) - Kartikya
2
哈哈,当然,没问题。不过说实话,我认为你会从OSdev.org的人们那里得到更多帮助。编写内核,特别是当你涉及汇编语言时,可能会非常困难,尤其是当你开始出现双重和三重错误时(至少你可以在异常处理程序中捕获双重错误)。我强烈建议使用像QEMU或BOCHS这样的模拟器,并且要非常熟悉它们的调试器(特别是BOCHS调试器)。此外,准备好花费大量时间阅读英特尔处理器开发者手册。 - Jason
非常感谢您,我一有进展就会与您联系。 - Kartikya

0

只需重新定位newlib。

printf,scanf等依赖于实现特定的函数来获取单个字符或打印单个字符。然后,您可以将stdinstdout设置为例如UART 1。


先生,这个新的库...它能够在没有任何支持的情况下运行吗?我的意思是它不依赖于特定的平台,只是确认一下。 - Kartikya

0

如果您不想将内核保留在内核模式并处理您计划的应用程序,则内核本身不需要printfscanf函数。但是,对于基本的printf和scanf功能,您可以编写自己的printf和scanf函数,这将提供基本的打印和输入支持。我在这方面没有太多经验,但您可以尝试创建一个控制台缓冲区,在其中键盘驱动程序将读取ASCII字符(经过扫描码转换)并使printfscanf在其上工作。我有一个基本实现,我已经编写了一个gets而不是scanf,并保持简单。要获得整数输出,您可以编写一个atoi函数将字符串转换为数字。

要移植其他库,您需要制作库所依赖的组件。您需要决定是否可以在内核中编写这些支持,以便可以移植库。如果比编写一些基本的输入输出函数更困难,那么在这个阶段编写一些基本的输入输出函数也不会太坏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接