0

是否可以使用未编译的语言(即解释为 python)或不使用运行时(如 Java)编写操作系统?虚拟机不需要在操作系统之上运行吗?

4

5 回答 5

4

微软研究院创建了一个名为Singularity的操作系统。

这是一个研究项目,我认为他们需要一些低级代码来启动启动过程(在某些时候操作系统需要与硬件对话)。

维基百科说

最低级别的 x86 中断调度代码是用汇编语言和 C 编写的。一旦该代码完成其工作,它就会调用内核,内核的运行时和垃圾收集器是用 Sing#(Spec# 的扩展版本,本身是扩展C#) 并在不受保护的模式下运行。硬件抽象层用 C++ 编写并在保护模式下运行。还有一些 C 代码来处理调试。在 16 位实模式引导阶段调用计算机的 BIOS;在 32 位模式下,Singularity 不再调用 BIOS,而是调用用 Sing# 编写的设备驱动程序。在安装过程中,使用 Bartok 编译器将通用中间语言 (CIL) 操作码编译为 x86 操作码。

于 2012-05-11T04:32:46.963 回答
3

当然。只是不要期望它很快,这就是为什么没有人这样做。

您可能必须在解释器中做一些有趣的事情(虚拟指令),以允许您的操作系统更改机器状态(寄存器和堆栈、内存映射、I/O 设备寄存器),以及允许硬件的特定机器中断转换为解释代码的执行,并退出以从中断返回。而且您可能对初始启动逻辑有一段艰难的时间;您的解释器显然无法将自己从磁盘加载。

但是对于大多数操作系统,如果做得好,例如使用 JIT 编译器,它会非常便携,并且实际上可能相当快。[您希望 JIT 编译器使用相同的语言进行编码,并接受自 JIT 处理]。

早在 1980 年代,我就在 OS 360 系统的这种架构中提出了一种编译为虚拟机解释代码的类 C HLL,并且几乎完成了构建它的交易。本来会很有趣的。呃,好吧。

于 2012-05-11T04:31:27.317 回答
0

是的,如果您在虚拟机中思考,这是可能的。

例如,您可以在 java 中创建一个小版本的 minix 以在 JVM 的顶部运行。但我不知道有人这样做的原因,除了太多的空闲时间:)

一个操作系统需要非常精简和快速。如果您选择 python,则在每个操作中都有 python 解释器开销。即使您考虑系统的一小部分,例如设备驱动程序:想象一下 python 解释器在内核空间中运行一段时间......

但对于教育或特殊情况(arduino?嵌入?)它是可以接受的。我认为 lua 可能是一个好主意,因为解释器非常小。

于 2012-05-11T04:45:08.580 回答
0

有大量的国产 Forth 操作系统。Forth 在某种程度上处于被“解释”的边缘(但我宁愿远离这个术语,它太模糊且被广泛滥用)。

于 2012-05-11T09:04:20.390 回答
0

除原始机器代码外,每种语言/编译器都使用一些运行时。例如 C 有一个叫做 crt0 的东西,它是任何 C 程序的一组执行启动例程。更不用说广泛使用的 libc。所以你无法避免它,正确的问题是:运行时应该有多大/效率?它应该如何表现?例如:我需要垃圾收集器吗?

现在必须将一些关键的操作系统部分编译为原始机器代码。否则 CPU 将不知道如何执行它。毕竟CPU只理解机器码。此外,它必须遵循引导过程,这意味着编译后的代码必须与 bios 或 uefi 或您用于引导的任何内容兼容。最后,为了利用所有/大多数 CPU 功能,必须在编译时发出一些原始机器代码或在运行时进行 jitted。例如 CPU 内核。虽然技术上没有必要,但您可能不想要一个不知道如何使用多个 CPU 内核的操作系统。

然后你几乎可以做任何你想做的事情。例如,您可以在自定义操作系统中嵌入 Java 运行时,并只让 Java 程序在其中运行。您可能仍然需要一些低级语言来实现一些低级功能,如硬件驱动程序。

请注意,从技术上讲,所有这些都可以用任何语言编写。即使您的操作系统是基于 Java 的,也可以完全用 Python 编写。归根结底,操作系统只是任何语言都可以发出的字节序列。尽管用 Python 从头开始​​编写所有内容是一个我不推荐的核心想法。

于 2021-11-16T14:07:09.577 回答