是否存在LibC操作系统?

时间:2012-10-25 06:45:02

标签: c++ c operating-system embedded osdev

我记得听说过一个基本上只是libc的可嵌入操作系统(也许它支持c ++)。它没有内核,管道或你期望从os获得的任何其他东西。我试着找in wikipedia,但我没有看到它列出来。

这样的操作系统是否存在?是否有支持终端或C / C ++ +(tcp)套接字的操作系统在VM外部进行通信?这对我来说很有用。

6 个答案:

答案 0 :(得分:38)

您没有为此找到名称的原因是它不是操作系统 - 而是缺少操作系统。通常这被称为“裸机”编程。

裸机编程的一般思想是,有一小部分通用代码 - "bootloader" - 用于设置板上的内存控制器和其他硬件,然后是将控制权转移到您的计划。 (操作系统也有bootloader,所以从这个意义上说你的程序是替换操作系统。)Uboot是一个相当常见的开源引导加载程序,所以这可能是一个很好的起点寻找信息。

关于裸机编程的一个棘手问题是,由于没有适当的操作系统来处理任何硬件通信,你必须考虑“printf实际意味着什么是什么数据转到什么外设?“和“如何让它去那里?”同样,一些引导加载程序为这种事情提供了支持,尽管连接它并不总是微不足道。再说一遍,Uboot就是一个很好的例子。

同时,C库本身实际上是由编译器提供的,而不是引导程序。

(我还应该补充一下,作为一个名称说明:我工作的公司制作了一系列裸机和Linux编译器,称为Sourcery CodeBench。对于CodeBench,裸机版本通常以他们用来链接程序的ABI规范,所以“ELF”或“EABI”版本都是裸机编译器,我认为这是引用这类东西的一种非常常见的方式,所以你会看到那种也可以说出来。)

答案 1 :(得分:6)

我认为你的一些假设存在问题。你说你不需要内核用于操作系统是正确的,但任何可以运行应用程序的东西都可以在libc中静态编译。

请参阅:http://www.superfrink.net/athenaeum/OS-FAQ/os-faq-libc.html

例如,只要为os编译该函数,就可以使用printf。因此,只要为它构建libc,就可以使用MenuetOS。

现在http://pdclib.rootdirectory.de/存在一个小版本的libc,某些嵌入式系统可以使用它。

通过这种方式,任何小型操作系统都可以被视为运行libc的操作系统。

答案 2 :(得分:6)

基本上不需要内核,但是如果你正在寻找一个最小的os http://wiki.osdev.org/Projects可能是一个重要的开始点。有许多业余爱好和半专业项目支持基本的东西,占地面积小。还有一些很好的教程可以自己编写。您还需要考虑驱动程序等对网络或串行I / O等简单事物的需求。

此外,Linux内核始终是一个良好的开端(前段时间有一个只有大约20MB的Linux发行版)

答案 3 :(得分:5)

有很多这些。

大多数专业的实时操作系统(RTOS)都或多或少地完成了C库的实现,甚至通常用于C ++(例如Keil MDK,μItron)。虽然在实践中你经常倾向于避免它,因为它使用了太多的可用资源。

RTOS通常具有非常小的内核,不支持文件或管道。相反,他们倾向于支持任务,计时器,队列和事件标志,而且开销很小。

答案 4 :(得分:3)

Libcc不是一个操作系统。尽管操作系统的定义有些模糊,但它确实包含的不仅仅是API。它需要内存管理,进程调度等。

答案 5 :(得分:0)

Newlib最小可运行示例

https://sourceware.org/newlib/

使用Newlib,您可以为裸机平台实现自己的系统调用。

我在这里提供了highly automated and documented example that shows Newlib built with crosstool-NG running in QEMU aarch64

例如,在上面的示例中,我们有一个示例程序exit.c

#include <stdio.h>
#include <stdlib.h>

void main(void) {
    exit(0);
}

在单独的C文件common.c中,我们用ARM semihosting实现exit

void _exit(int status) {
    __asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}

您将实现的其他典型的系统调用是:

  • write将结果输出到主机。这可以通过以下方式完成:

    • 更多半主机
    • UART硬件
  • brk代表malloc

    易于使用裸机,因为我们不必关心分页!

TODO,我想知道在不陷入preemptive scheduling syscallsRTOS之类的Zephyr的情况下达到FreeRTOS执行是否现实。

Newlib的妙处在于,它为您实现了所有非OS特定的功能,例如string.h,并允许您仅实现OS存根。

此外,您不必实现所有存根,而只需实现所需的存根。例如,如果您的程序仅需要exit,则不必提供print。 Newlib通过将所有系统调用的虚拟禁止操作实现作为弱符号来实现此目的。

Newlib源代码树已经有一些实现,包括newlib/libc/sys/arm下的ARM半主机实现,但是在大多数情况下,您必须实现自己的实现。但是,它确实为任务提供了坚实的基础。

设置Newlib的最简单方法是使用crosstool-NG构建自己的编译器,只需告诉它您要将Newlib用作C库即可。我的设置使用this script为您自动处理,它使用crosstool_ng_config上的newlib配置。

C ++也应在理论上起作用,但是my initial attempt was unsucessful