【问题标题】:Is a boot loader without assembly language possible?没有汇编语言的引导加载程序可能吗?
【发布时间】:2015-06-22 11:25:16
【问题描述】:

我正在研究操作系统的概念。操作系统的基本起点是它的引导加载程序。引导加载程序通常用汇编语言编写。是否有可能在没有一行汇编语言的情况下创建一个引导加载程序

【问题讨论】:

  • 您可能想提供更多关于此的背景信息。因为,好吧,也许已经编写了一个 C 库,可以很容易地为特定架构编写引导加载程序,但这并不意味着没有人曾经编写过一行汇编程序。
  • 我们可以用 C 语言编写引导加载程序吗(纯粹是,甚至没有一个汇编代码)?
  • 我刚刚在评论中回答了这个问题。我认为你需要更加仔细地思考你真正在问什么。,
  • 我编写了没有汇编代码的引导加载程序,所以是的。您需要更改此标题。在没有汇编语言的情况下编写操作系统与在没有汇编语言的情况下编写引导加载程序是不同的问题,答案也不同。
  • 是的。而是直接用机器语言编写并绕过汇编程序。

标签: assembly operating-system bootloader bootstrapping


【解决方案1】:

可以:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      从技术上讲,不必组装。当然可以通过其他方式创建引导加载程序

      【讨论】:

      • 好吧,我猜是在 C 中,但是在某些时候你需要使用汇编来与硬件等“对话”......
      【解决方案4】:

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

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

      总而言之,答案是:汇编不是强制性的,您只需要一种具有足够expressive power 的语言来描述您的操作系统应执行的任务。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          当然可以在没有汇编语言的情况下创建一个引导加载程序,我怀疑你断言引导加载程序是:

          “最常用汇编语言编写。”

          但是标题中的问题与正文中的问题不同;引导加载程序不是操作系统的一部分,而包含抢先式调度的操作系统几乎肯定需要一些汇编语言代码来至少执行上下文切换。

          【讨论】:

          • 我只是在学习。所以我很抱歉。先生,如果是这样,那么没有汇编就不能编写操作系统?
          • 在某些时候你需要编写程序集是你编写一个新的操作系统。你将如何与硬件“对话”?
          • @nandhakumar :最简单的内核上下文切换需要切换堆栈指针;我所知道的任何系统级语言中都没有高级语言结构可以做到这一点 - 所以至少需要汇编程序,并且可能需要其他处理器特定的核心(非内存映射)寄存器访问。
          • @FatGiant:如果 I/O 是内存映射的,那么“与硬件对话”就不是问题。问题是修改未映射内存的核心寄存器。
          • @FatGiant :作为嵌入式系统开发人员,我的优势可能是每天都直接“与硬件对话”。例如,如果硬件设备有一个映射到地址 0x8000 的寄存器,那么uint16_t input = *0x8000 将读取它(没有汇编程序)。许多带有内存管理单元的目标操作系统会阻止用户级代码这样做,但操作系统或设备驱动程序代码不会,而且许多嵌入式系统在任何情况下都缺少 MMU,甚至没有“用户级”的概念。
          猜你喜欢
          • 2019-11-18
          • 2016-01-16
          • 2015-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-23
          • 2016-09-27
          • 1970-01-01
          相关资源
          最近更新 更多