是否可以使用未编译的语言编写操作系统[即像 python 一样解释] 或者不使用运行时 [像 Java] ?虚拟机不需要在操作系统之上运行吗?
微软研究院创建了一个操作系统,称为 Singularity。
尽管这是一个研究项目,我认为他们需要一些低级代码来启动启动过程(在某些时候操作系统需要与硬件通信)。
最低级别的 x86 中断调度代码是用汇编语言和 C 编写的。一旦该代码完成其工作,它就会调用内核,其运行时和垃圾收集器是用 Sing#(Spec# 的扩展版本,本身就是一个C# 的扩展)并在无保护模式下运行。硬件抽象层用C++编写,运行在保护模式下。还有一些 C 代码来处理调试。计算机的 BIOS 在 16 位实模式引导阶段被调用;一旦进入 32 位模式,Singularity 就不再调用 BIOS,而是调用用 Sing# 编写的设备驱动程序。在安装过程中,通用中间语言 (CIL) 操作码会使用 Bartok 编译器编译为 x86 操作码。
当然。 只是不要指望它会很快,这就是为什么没有人这样做。
您可能需要在解释器中做一些有趣的事情(虚拟指令),以允许您的操作系统更改机器状态(寄存器和堆栈、内存映射、I/O 设备寄存器),以及特定于机器允许的操作硬件中断转换为解释代码的执行,然后退出以从中断返回。 您可能会在初始启动逻辑方面遇到困难;您的解释器显然无法从磁盘上加载自身。
但对于大多数操作系统来说,如果做得正确,例如使用 JIT 编译器,它将非常可移植,并且实际上可能相当快。 [您希望 JIT 编译器使用相同的语言进行编码,并进行自 JITting]。
我在 20 世纪 80 年代的 OS 360 系统中提出了一个类似 C 的 HLL,它可以编译为虚拟机解释代码,正是这种架构,并且几乎达成了构建它的交易。 会很有趣的。 啊好吧。
是的,这是可能的,如果你在虚拟机中思考的话,这是专业的。
例如,可以用java创建一个小版本的minix,运行在JVM之上。但我不知道有人这样做的原因,除了太多的空闲时间:)
一个操作系统需要非常精简且快速。如果您选择 python,则每个操作都会有 python 解释器开销。即使您考虑系统的一小部分,例如设备驱动程序:想象一下 python 解释器在内核空间中运行一段时间......
但对于教育或特殊情况(arduino?嵌入?)这是可以接受的。我认为 lua 是一个好主意,因为解释器非常小。
有大量的本土 Forth 操作系统。 Forth 有点处于“解释”的边缘(但我宁愿远离这个术语,它太模糊并且被广泛滥用)。
除了原始机器代码之外,每种语言/编译器都会利用一些运行时。例如,C 有一个名为 crt0 的东西,它是任何 C 程序的一组执行启动例程。更不用说广泛使用的libc了。所以你无法避免它,正确的问题是:运行时应该有多大/效率如何?它应该如何表现?例如:我需要垃圾收集器吗?
现在操作系统的一些关键部分必须编译为原始机器代码。否则CPU将不知道如何执行它。毕竟CPU只能理解机器码。此外,它必须遵循启动过程,这意味着编译的代码必须与 BIOS 或 uefi 或您用于启动的任何内容兼容。最后,为了利用所有/大多数 CPU 功能,一些原始机器代码必须在编译时发出或在运行时进行抖动。例如CPU核心。虽然技术上没有必要,但您可能不想要一个不知道如何使用多个 CPU 核心的操作系统。
然后你几乎可以做任何你想做的事情。例如,您可以在自定义操作系统中嵌入 Java 运行时,并且只允许 Java 程序在其中运行。尽管如此,您可能仍然需要一些较低级的语言来实现一些低级功能,例如硬件驱动程序。
请注意,从技术上讲,所有这些都可以用任何语言编写。即使您的操作系统是基于 Java 的,也可以完全用 Python 编写。归根结底,操作系统只是任何语言都可以发出的字节序列。尽管从头开始编写所有内容(例如 Python)是一个我不推荐的核心想法。