【问题标题】:Why is C used for writing drivers and OS codes? [closed]为什么 C 用于编写驱动程序和操作系统代码? [关闭]
【发布时间】:2022-04-08 00:26:56
【问题描述】:

为什么用 C 来编写驱动程序和操作系统代码?

有尺寸问题吗?

有没有用其他语言编写的驱动程序?

XP、Vista 和 Solaris 是用哪种语言编写的?

【问题讨论】:

  • 大小是问题的一部分,但速度也是如此。 C是轻量级和快速的。另外,我猜是经过尝试、测试和验证的:p
  • Mark:评论是针对cmets的。答案在下面。您提供了答案。
  • C 程序员做得更好更完美..就这么简单。
  • C 很棒。 C 打败别人。 C也生火。 C 太酷了。

标签: c


【解决方案1】:

C 可以编译成机器代码,并且不需要语言本身的任何运行时支持。这意味着可以编写可以在文件系统、虚拟内存、进程以及除寄存器和 RAM 之外的任何其他事物存在之前运行的代码。

【讨论】:

  • 虽然这在一定程度上是正确的,但你必须小心你使用的语言特性,因为如果我没记错的话,浮点运算,至少转换,仍然需要 C运行时库。尽管如此,与许多其他语言不同,C 运行时的代码可以嵌入到应用程序本身中。很多人忽略的一点是,加载程序本质上必须用汇编程序编写,除非你有一个可以为计算机编译合适的启动映像的 C 编译器。
  • @webboy42,如果 C 代码已经在内存中,例如在微控制器或 BIOS 中,您只需要几条指令就可以在复位向量上跳转到 C 代码的开头。这么少的机器码,一点一点就可以手工构建,不需要汇编器:)
  • 现代架构不需要运行时库来进行浮点转换。这是一个对例如第一个操作码的调用。
  • “C 遵循机器代码,不需要语言本身的任何运行时支持。”这是编译器的特性,而不是语言的特性。
  • 在这一点上,我不确定这是否重要。使用交叉编译器,您可以重新编译系统以在任何架构上工作。一旦考虑到这一点,编译运行时实际上可能比移植和重新编译 1000 个应用程序更好/更可靠。我认为这更多地与惯性有关,而且我认识的大多数以操作系统为中心的工程师并没有真正愿意改变这么大的东西。
【解决方案2】:

在对安全至关重要的环境中(想想航空电子设备、航天器、医疗设备、运输、过程控制的控制软件),系统(以及驱动程序)通常使用Ada 甚至SPARK/Ada 编写。

澄清一下:C 通常被理解为相当低级,并且很像汇编本身的“宏语言”,这也是它的强大之处(速度、大小、可移植性)。

另一方面,Ada 专为具有可验证性的安全关键型应用而设计,引用 Ada 2005 for Mission-Critical Systems

Ada [9] 是许多关键系统的首选语言,因为它经过精心设计,并且存在用于构建高完整性系统的明确指南 [10]

这也是 Ada 支持强类型的地方,以及许多其他重要功能(引用 design for safety):

编程语言在 它们适用于 安全相关系统。卡雷等人。 确定了六个影响因素 一种语言的适用性 高完整性应用 [Carré 1990]。它们是:

  • 逻辑合理性
  • 定义的复杂性
  • 表现力
  • 安全性
  • 可验证性
  • 有限的时间和空间限制

没有标准的编程语言执行 在所有这些领域都很好,虽然有些 (例如 Pascal 和 Ada)执行很多 比 C 或其他语言更好 C++。在高度关键的应用中 “可验证性”非常重要 重要性。某些语言允许 强大的软件验证工具 用于执行广泛的 对代码进行静态测试以检测 编程错误的范围。 [...] 一个 选择一个重要的问题 编程语言是质量 可用的编译器和其他 工具。对于某些经过验证的语言 编译器可用。虽然不是 保证完美,验证 大大增加了我们的信心 工具。不幸的是,经过验证 编译器仅适用于 语言数量有限,例如 艾达和帕斯卡。此外 编译器,关键的开发人员 系统将利用一系列 其他工具,例如静态代码 分析包。静态测试 可以在一块上执行 代码变化很大取决于 使用的语言。为了帮助这个过程,它 是常见的限制功能 在某些语言中使用 到语言的“安全子集”。 结构良好且定义良好的语言 例如 Ada、Pascal 和 Modula-2 允许大量测试 进行数据流等 分析,数据使用分析, 信息流分析和范围 检查。不幸的是,其中许多 无法对语言进行测试 比如C和C++。

更详细地讨论这个问题确实超出了这个问题的范围,但您可能需要查看以下一些提示:

如果有人想进一步了解 Ada,请查看:Ada Programming (wikibooks)

甚至还有专门为高度关键的应用程序开发的编程语言,例如JOVIALHAL/S,后者用于航天飞机程序。

是否有任何其他语言编写的驱动程序?

我见过一些用 Ada 编写的用于特殊硬件的 Linux 驱动程序,但不知道其他操作系统。但是,此类驱动程序通常最终会封装 C API。

【讨论】:

  • 请解释一下为什么选择 Ada 而不是 C?听起来很有趣。
  • 我已经修改了答案以更详细地说明并提供更多观点,希望这会有所帮助
【解决方案3】:

因为 C 具有速度、内存使用率低、对硬件的低级访问和流行度的最佳组合。

大多数操作系统都有一个用 C 编写的内核,而在内核之上的应用程序则是用 C、C++、C# 或 Obj-C 编写的

【讨论】:

  • 据我所知,最低级别的操作系统内核至少需要一些程序集。虽然不是操作系统编写者,但我可能错了。
  • 我认为只是引导程序
【解决方案4】:

到目前为止,C 是最容易在裸机硬件上“开始”的语言(除了汇编)。使用 C,(假设您有一个 32 位引导加载程序,例如 GRUB 来进行硬模式切换)您所要做的就是创建一个小的 crt0.asm 文件来设置堆栈,就是这样(您获得了语言,不包括 libc) .使用 C++,您必须担心动态转换、异常、全局构造函数、覆盖 new 等。使用 C#,您必须移植 .Net 运行时(它本身基本上需要内核),我不确定 Obj-C ,但我敢肯定它也有一些要求......

C 是驱动程序最容易使用的语言。不仅容易上手,而且很容易准确地知道在机器级别发生了什么。他们没有运算符重载来迷惑你等等。当然,它在“良好”环境中很方便,但在 Ring 0 中,错误的指针不仅会使您的应用程序崩溃,而且通常会导致三重故障(重新启动)、蓝屏或内核崩溃。你真的很想知道你的机器发生了什么..

【讨论】:

    【解决方案5】:

    “为什么我们使用 C 语言来编写驱动程序和操作系统代码?”

    这样程序员就不必为每种新机器学习每种新汇编语言的新语法。

    “是否有任何其他语言编写的驱动程序?”

    从历史上看,汇编语言。我不记得 PL/S 或 BLISS 是否可用于驱动程序。也许是 B。在现代,一些勇敢的人使用 C++,但他们必须非常小心。在某些情况下,在用户模式驱动程序中可以更轻松地使用 C++。

    【讨论】:

      【解决方案6】:

      Lisp machines 的操作系统是用 Lisp 编写的,这表明您没有使用 C 或汇编语言。 Lisp 机器业务因廉价 PC 的出现而被摧毁,其操作系统当然是用 C 和汇编语言编写的。

      【讨论】:

        【解决方案7】:

        C 是最早适合编写操作系统的语言之一(不是汇编语言),所以它很早就流行起来。虽然此后出现了其他适合编写操作系统的语言,但 C 语言仍然很受欢迎,这可能是由于其悠久的历史以及程序员对其结构和语法的熟悉程度。

        【讨论】:

        • +1 - 提醒我“Unix 和 C 是终极计算机病毒”
        【解决方案8】:

        C 也是一种语言,它教授了很多关于内存管理的知识,并且低级足以显示硬件和软件之间的障碍。这在今天的许多方法中是罕见的,它们在硬件级别上已经朝着抽象的方向发展。我发现 C 是学习这些东西的好方法,同时能够编写快速的代码。

        【讨论】:

          【解决方案9】:

          请记住,C 最初是为编写操作系统(在本例中为 Unix)和类似的低级东西而开发的。它非常接近系统架构,并且不包含我们想要控制的任何额外功能,它们是如何工作的。但是,请注意操作系统的其余部分,包括编程库,不必使用与内核相同的语言编写。内核函数是通过中断系统提供的,事实上,这样的编程库可以用任何支持汇编程序 sn-ps 的语言编写。

          当今最流行的操作系统是用 C 语言编写的:Windows、Linux 和许多其他 Unix 克隆,但这不是规则。有一些面向对象的操作系统,内核和编程接口都是用客观语言编写的,例如:

          • NeXTSTEP - Objective-C
          • BeOS - C++
          • 音节 - C++

          见:Object-oriented operating system on Wikipedia

          请注意,在 Linux 中,可以使用 C 以外的语言编写内核驱动程序(但不建议这样做)。无论如何,在运行它时,一切都变成了机器代码。

          【讨论】:

          • NeXTSTEP 操作系统的内核(称为 Mach)不是用 C 编写的,也不是 Objective-C。
          【解决方案10】:

          “C 可以编译成机器代码,并且不需要语言本身的任何运行时支持。”

          这是C的最大特点

          【讨论】:

          • 这适用于许多语言:Pascal、Qbasic、asm。 C++。
          • 同意,所有语言都可以做 C 做的事情
          【解决方案11】:

          我相信 Python、Java 等语言之所以受欢迎,主要是因为它们提供了广泛的标准库,允许程序员用更少的行数编写解决方案。从字面上看,ruby 程序员可以在一行中打开和读取文件,而在 C 中需要多行。然而,在这个抽象之下是多行。因此,在 C 中进行相同的抽象是推荐的。奇怪的是,C 的哲学似乎不是为了减少代码的总行数,所以没有有组织的努力来这样做。 C 似乎被视为所有处理器芯片的语言,这自然意味着很难创建任何“标准”抽象的单行解决方案。但是 C 确实允许您使用 #ifdef 预处理器命令,因此理论上您可以在一个头文件中为多个处理器和平台实现多种变体。对于 python 或 java,情况并非如此。因此,虽然 C 没有花哨的标准库,但它对可移植性很有用。如果您的公司想要提供在计算机、嵌入式和便携式设备上运行的程序,那么 C 是您的首选语言。很难取代 C 在世界上的用处。

          【讨论】:

            【解决方案12】:

            对于具有其他语言驱动程序的机器的另一个说明,有SunSpot 机器人平台。连接的设备(传感器、电机和所有其他可以通过 I/O 引脚进行通信的设备)的驱动程序由用户用 Java 编写。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-09-04
              • 2013-02-27
              • 2017-04-30
              • 1970-01-01
              • 2011-11-19
              • 1970-01-01
              • 2013-08-18
              • 2011-10-16
              相关资源
              最近更新 更多