没有汇编语言的引导加载程序可能吗?

Is a boot loader without assembly language possible?

我正在研究操作系统的概念。 OS 的基本起点是其引导加载程序。引导加载程序通常是用汇编语言编写的。是否可以创建 boot loader 而无需一行汇编语言?

从技术上讲不一定非得是汇编。当然可以通过其他方式创建引导加载程序

当然可以不用汇编语言创建一个 boot-loader,我怀疑你关于 boot-loader 的断言是:

"most often written in assembly language."

但是标题中的问题与body中的问题不同; boot-loader 不是 OS 的一部分,而包含 pre-emptive 调度的 OS 几乎肯定需要一些汇编语言代码来至少执行上下文切换。

从技术上讲,这是可能的。您需要一个可以生成特定指令的编译器。您可以使用带有内联汇编的 C 编译器来完成它。旧的 BLISS 编程语言可能能够在某些实现中做到这一点。

可以:

  • 设计一个内置支持引导加载程序可能需要的任何内容的编译器,这样您就可以在该编译器的语言中执行所有操作而无需汇编
  • 使用低级语言(机器代码)
  • 设计一台固件直接支持高级语言的计算机(例如现代 UEFI 可以直接从 C/C++ 使用)

不过,none这与实用性无关。对于很多情况(例如 80x86 BIOS),使用某些程序集比避免它要容易得多。请注意,"some assembly" 可能只是固件功能的包装器和一些初始化代码;其中大部分引导加载程序使用其他语言。

嗯,OS 的起点不是引导加载程序。在某些系统上(我在 ARM7 上做过)你可以 运行 你的 OS 没有任何引导加载程序。如果您不需要任何引导加载程序,则您的引导加载程序中不需要任何汇编指令。

OS 本身呢? OS 的主要作用是调度多个任务,每个任务都有自己的上下文。大多数处理器体系结构都依赖堆栈为局部变量分配内存。语言通常对栈的概念进行抽象,只保留"local variable"的概念,因此无法切换任务上下文。所以,基本上,只用C语言写一个OS是不可能的。然而,一些语言允许访问每个处理器资源(主要是内部寄存器)。例如,PL/M51 允许为 intel 8051 处理器编写 OS 而无需任何汇编。

总而言之,答案是:汇编不是强制性的,您只需要一种语言expressive power 足以描述您OS 应执行的任务。

如果你有Intel BITS,你可以在Python中编写loader。
否则,您可以使用 UEFI 库在 C 或 C++ 中编写加载程序。
相反,您可以编写一个编译器,将您的 C++ 代码转换为 X86 机器代码,并创建特殊的程序集来启动您的内核。那你可能不会写bootloader。
而且,如果您没有 BITS 或 UEFI,并且您不想这样做,那么您不能这样做。