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

res*_*sgh 19 c operating-system

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

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

Wan*_*gic 20

对于"你能用C完全编写程序 "这一问题的传统答案是"不".原因是C程序无法建立自己的堆栈.

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

POSIX定义一组函数,setcontext,getcontext,makecontextswapcontext(几乎总是被写入至少部分地在汇编程序),这将使您读写堆栈和帧指针.

不幸的是,setcontext功能系列并未得到广泛实施.


Enr*_*Fan 7

理论上是的,但不是一切.

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

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

编辑:
现在GCC(4.9.0)支持-m16允许16位代码生成的选项,因此可以进一步减少组件使用,例如bootsector/bootloader(尽管有些位仍需要它).


Gil*_*il' 7

这取决于你的意思C.

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

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

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

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