在编写内核时可以使用stdio吗?

我需要构建一个操作系统,一个非常小的基本操作系统,实际上function最少,用C编码。

可能是一个CUI操作系统,它做一些内存管理,至少有一个文本编辑器和一个计算器,它只是一个关于如何制作一个完全和直接控制你的硬件的代码的实验。

我仍然需要一个接口,需要输入/输出function,如printf(&args),scanf(&args)。 现在我的基本问题是我应该使用现有的标题还是从头开始编码,为什么会这样?

我非常感谢你们的帮助和帮助。

首先,你无法链接来自libc任何内容……你将不得不从头开始编写所有代码。

现在我自己开发了一个微内核,我不会使用libc附带的实际stdio头文件,因为它们会混杂着许多与你的操作系统无关的额外信息,或者会产生编译错误。缺少定义等等。我做的是保持这些标准函数的函数签名相同…所以最后你会得到一个名为stdio.h的文件用于你的操作系统,但它会是一个非常简化的头文件,具有满足您需求的基本最低要求,并且只具有您需要的标准I / Ofunction,并具有正确的标准签名。

请记住后端,即在stdio.c文件中,您必须将这些函数指向自定义控制台驱动程序或其他类型的字符驱动器以供显示。 要么就是这样,要么就可以将它们用作其他内核级显示打印例程的包装器。 您还要确保即使您可以在其他OS代码模块中使用#include 指令来访问这些打印function,也不要链接到libc 。 这可以使用gcc -ffreestanding完成。

只需重新定位newlib。

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

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

要在其他库中移植,您需要创建库所依赖的组件。 你需要做出决定,如果你可以在内核中编写这些支持,以便可以移植库。如果更难以编码一些基本的输入输出函数,我认为在这个阶段不会坏,