是否可以在C中完全编写操作系统?

时间:2014-08-23 04:49:41

标签: c operating-system

是否可以在C中完全编写操作系统?

完全上,我将所有内容都包含在引导加载程序中,但不包括BIOS / UEFI。

3 个答案:

答案 0 :(得分:20)

问题的传统答案"你能在C&#34中完全写一个程序吗?是"没有。"原因是C程序无法建立自己的堆栈。

几乎每个处理器都至少有一个寄存器指向堆栈中的当前地址(通常称为帧指针),有时还有第二个寄存器(通常称为堆栈指针)需要指向堆栈中的下一个未使用的地址。没有办法在语言本身中使用任何表达式或语句来将堆栈指针或帧指针设置为绝对值。 (过程调用和返回可以从堆栈指针中添加和减去,但是无法将其初始化为已知值。)

Posix定义了一组函数,setcontextgetcontextmakecontextswapcontext(几乎总是至少部分写在汇编程序中),这将使您能够阅读并写入堆栈和帧指针。

不幸的是,setcontext系列函数没有得到广泛实施。

答案 1 :(得分:7)

理论上是,但不是一切。

对于引导加载程序和实模式的东西,你可以找到一些旧的16位编译器(例如Turbo C),告诉他输出普通的二进制文件并用它来写所有的东西。
或者,或者在GCC上,您可以将asm(".code16gcc")置于代码之上,但我不建议这样做,因为GCC无法直接输出16位代码,结果汇编程序可能需要超过512个字节

对于其他东西,无法使组件使用无效。
是的,你可以隐藏内联函数(IN \ OUT,CRx寄存器和东西)中的所有装配线,但是对于其他东西,比如中断,你将被迫使用汇编。

修改
现在GCC(4.9.0)支持-m16选项,它可以生成16位代码,因此可以进一步减少组件的使用,例如bootsector / bootloader(虽然有些位仍需要它)。

答案 2 :(得分:7)

这取决于你的意思。

如果您指的是ISO定义的标准C编程语言,仅依赖于已定义的行为,并且您正在考虑在硬件上运行的通用变种操作系统,那么不可能, C语言中的实际操作系统,因为C缺少许多工具,特别是访问硬件和操作单独的程序。

可以编写一个由C程序组成的操作系统,只能通过C工具提供输入/输出,但这不是在实际硬件上运行的操作系统。您可以通过这种方式为机器及其操作系统编写模拟器。

如果您允许特定于实现的行为,那么答案很简单,因为允许实现添加他们认为合适的扩展。它绝对有可能有一个C实现,其中operating_system();是实现操作系统的程序的源代码。

如果你的意思是在不使用任何程序集的情况下是否可以使用典型的C编译器构建操作系统(包括运行时环境),那么答案通常是否定的,因为C编译器通常缺少一些原语OS编写器只对它感兴趣,例如执行上下文切换和建立堆栈所需的内容。然而,这不是一个绝对的规则。如果您愿意,它取决于运行时环境的哪些部分来自编译器编写器以及哪些部分来自OS编写器。