我需要构建一个非常小且基本的操作系统,实际上功能最少,用C编码。
可能是一个CUI操作系统,它可以进行一些内存管理,至少有一个文本编辑器和一个计算器,它只是一个关于如何制作能够完全直接控制硬件的代码的实验。
我仍然需要一个接口,它需要输入/输出功能,如printf(& args),scanf(& args)。现在我的基本问题是我应该使用现有的标题还是实际从头开始编码,为什么会这样?
我非常感谢你们的帮助。
答案 0 :(得分:3)
首先,你无法链接来自libc
的任何内容...你将不得不从头开始编码。
现在我自己开发了一个微内核,我不会使用stdio
附带的实际libc
标题,因为它们会混杂着很多额外的信息。与你的操作系统无关,或者由于缺少定义等而会产生编译器错误等。我 会做的是保持这些标准功能的功能签名相同...所以最后你会有一个名为stdio.h
的文件,适用于您的操作系统,但它是一个非常精简的头文件,具有满足您需求的基本最低要求,并且只具有您需要的标准I / O功能,并具有正确的标准签名。 / p>
请记住后端,即在stdio.c
文件中,您必须将这些功能指向自定义控制台驱动程序或显示器的其他类型的字符驱动器。或者,或者你可以将它们用作其他内核级显示打印例程的包装器。您还需要确保即使您可以在其他操作系统代码模块中使用#include <stdio.h>
指令来访问这些打印功能,也不要链接libc
。这可以使用gcc -ffreestanding
完成。
答案 1 :(得分:0)
只需重新定位newlib。
printf, scanf,
等依赖于特定于实现的函数来获取单个char或打印单个char。然后,您可以将stdin
和stdout
设置为UART 1。
答案 2 :(得分:0)
如果您不希望将内核保持在内核模式并运行您计划的应用程序,则内核本身不需要printf
和scanf
函数。但是对于基本的printf和scanf功能,您可以编写自己的printf和scanf函数,这将为打印和输入提供基本支持。我对此没有太多经验,但您可以尝试创建一个控制台缓冲区,其中键盘驱动程序将读取的数字设置为ASCII字符(从扫描代码转换后),然后生成printf
和{{1} } 在...上下功夫。我有一个基本的实现,我写了一个scanf
而不是gets
,并保持简单。要获得整数输出,您可以编写scanf
函数将字符串转换为数字。
要在其他库中移植,您需要创建库所依赖的组件。你需要做出决定,如果你可以在内核中编写这些支持,以便可以移植库。如果更难以编码一些基本的输入输出函数,我认为在这个阶段不会坏,/ p>