我喜欢操作系统,并最终想成为一名主要从事内核工作的操作系统开发人员。将来 C 语言仍将是首选语言,我还应该尝试学习什么?
17 回答
在研究人群中,有很多人对使用基于语言的技术来保证内核不会出现异常感兴趣。很多人都提到了Singularity项目,该项目目前(当之无愧地)备受瞩目。为什么奇点有趣?
该语言包括一个用于正确使用锁的有限状态模型。编译器可以根据模型对代码进行模型检查,以确保不会发生死锁。
第三方驱动程序被赋予系统的有限接口。编译器所做的检查保证了一个坏的驱动程序不能把系统弄坏——它可以做的最坏的事情就是把它自己的设备弄坏。
Singularity 使用编译器技术,而不是 OS/MMU 技术,将一个“进程”与另一个“进程”隔离开来。突然分叉一个新的“过程”(实际上是一种新的保护域)非常便宜,而这种便宜使新设计成为可能。
Singularity 只是众多使用语言和编译器技术解决操作系统问题的项目中的最新一个。我最喜欢的一个是华盛顿大学SPIN 内核,它允许应用程序安全地扩展内核,并且是用 Modula-3 编写的。
这个研究领域仍然很开放,目前还不知道哪组语言或编译器功能是解决操作系统问题的“最佳位置”。所以回答你的问题:
在今天的生产系统中,C 仍然是“它”。
对于未来的操作系统,C 几乎可以肯定不是“它”——我们知道它可以做得更好——但新的“它”的确切性质仍然是一个悬而未决的问题。
我认为可以肯定地说操作系统的低级部分(例如内核)将继续用 C 语言编写,因为它的速度很快。就像其他地方提到的那样,您需要了解内核某些部分的汇编程序(需要将内核加载到内存中)。但是您可以在很少或根本没有汇编知识的情况下使用内核。一个很好的例子是如果你正在实现一个文件系统。
不要担心操作系统是用什么语言实现的。重要的是如何使用操作系统,以及可以做些什么来改进它们。一个很好的例子是 Unix 刚出现的时候。文件系统的 inode 位于磁盘的前端,数据位于剩余空间中。当您为所有文件寻找磁盘的不同部分时,这并没有很好地执行。然后创建了Berkeley 快速文件系统来创建磁盘感知文件系统。这意味着在其相应数据附近有 inode。我省略了很多细节,但我希望这能说明更重要的是思考如何改进操作系统,而不是用什么语言来编程。
操作系统的一些最新趋势是虚拟化和分布式计算(参见 Google 关于MapReduce的论文)。文件系统、安全性、调度(尤其是多核处理器)等一直是人们感兴趣的领域,尽管这些问题并不新鲜。
如果您想了解有关内核开发的更多信息,这里有一些资源:
- Linux Kernel Newbies - 为想要开始修改 Linux 内核的人提供的资源。
- xv6 源- Unix 版本 6 的 x86 端口。由 MIT 用于教授操作系统课程。简单,易于扩展(更多信息)。
- Linux Kernel Map - Linux 中系统调用的调用链。在可视化系统调用的作用时很有用。
底线:开始熟悉内核并阅读有关研究人员正在撰写的论文(USENIX对此很有用)。这种知识比学习一门新语言更有价值,因为如果操作系统的编写方式发生了变化,大多数概念可以很容易地从一种语言转移到另一种语言。希望这可以帮助!
C 几乎就是它,具有相当数量的汇编程序。操作系统内核工作的重要主题包括:
- 缓存原理和缓存管理
- 虚拟内存、TLB管理
- CPU和系统架构
- 存储层次结构
- 并发编程技术(互斥、锁定等)
- 算法和数据结构
实际上,现代操作系统的核心有相当多的空间用于 C++ 代码。我只是看了看,Win7 核心内核树有相当多的 C++ 代码。请注意,许多子系统仍然使用简单的 C。这有几个原因
- C 是基于 NT 的操作系统的原始语言
- 关键人物非常非常了解 C
- 编写良好的 C 语言可能是最直接的调试代码——尤其是在内核模式下。
话虽如此,许多团队和人员发现编写良好的 C++ 是核心操作系统工作的有效工具。
C++ 没有什么可以阻止它被用来编写核心资源管理代码,如调度程序、内存管理器、I/O 子系统、图形子系统等。
正如其他人指出的那样 - 任何内核工作总是需要一些汇编语言。
我认为在可预见的未来,严肃的(非实验性的)操作系统开发仍将保留在 C(和汇编)中,这是一个非常安全的赌注。
我提交的证明是艾达。它可以像 C 一样裸机,提供对数据放置的更好控制,并且对几乎所有内容都有更安全的默认行为(例如:数组边界检查)。从 OS 开发人员的角度来看,它在您能想到的任何技术参数上都等于或优于 C。它已经上市 20 多年了(好吧……价格合理,也许只有 15 年)。
因此,如果人们正在寻找一种在技术上优于 C 的语言,您应该看到到处都是用 Ada 编写的操作系统,对吗?我实际看到的是在 Ada 中实现的一个严肃的操作系统。不再支持在 C 中重新实现它。
操作系统开发中其他语言的障碍不是技术性的,也从来不是技术性的。我不认为 C 的非技术优势会很快消失,而且没有人会通过简单地设计一种更好的语言来克服它们。
微软正在用 .NET 重写一些 Windows,但我怀疑大部分内核会被触及。
然而,像 Cosmos ( http://www.gocosmos.org/index.en.aspx ) 这样的项目给了我们希望。
不,它不是“它”。内核通常是用 C 语言编写的,并带有一些汇编程序。但是操作系统是用各种语言编写的。但即便如此,C++ 也可以毫无困难地使用。许多其他语言也可以。Linux 是由 C 狂热者编写的,他们害怕和厌恶其他一切,这是他们的问题。Windows 是用 C 和 C++ 的大量组合编写的,并且可能还包含一些旧的 Pascal 代码。而现在,大量的 .NET 也出现了。OS X 对大部分 OS 代码使用 Objective-C。
相同的建议适用于所有其他编程领域:
- 了解你的东西
- 不要将自己局限于一种真正的语言。
内核是唯一适用一些“特殊”规则的区域。但是内核很小。绝大多数操作系统都可以用任何语言编写。
你当然需要知道 C,是的,但仅仅知道 C 还远远不够。
您可能想看看 Microsoft 的Singularity项目(也在Wikipedia上):
Singularity 是 Microsoft Research 自 2003 年以来构建的实验性操作系统。它旨在作为一个高度可靠的操作系统,其中内核、设备驱动程序和应用程序都以托管代码编写。
这个操作系统只有极小部分实际上是用 C 编写的,其余部分是用更高级的语言(Sing#,C# 的扩展)编写的。在未来,我相信你可以期待看到更多这种东西变得可用。
很多时候,您会听到一些说法:C 语言是速度和 Ada 的同义词,而不是。这不是真的。Ada 添加了一些减慢执行速度的检查。这是真的,但出于调试目的或安全性。因此,它们可以在编译时通过配置删除。因此,您可以在没有开销的情况下生成 ADa 程序。另一方面,请注意 gnu 编译器将 Ada 和 C 翻译成相同的中间代码。结果,您最终获得了相同的可执行代码。我在这里读到 Ada 不能用于开发驱动程序。那是假的。Ada 具有与 C 语言相同的能力。此外,它避免了许多错误。您可以看到它存在一个完全用 Ada 编写的实时操作系统 MarteOS。
Ada 不用于编程 OS 内核的主要原因是 C 语言是用于 Unix 的语言。使用 C 原型表示系统调用 API 是 POSIX 规范。所有的操作系统片段都已经用 C 编写了。而且,C 语言代表了世界上开发的软件的 17%。
最后,艾达很严格,很多人不喜欢这样。他们更喜欢开发有漏洞的软件,并花更多的时间进行调试。
好吧,在 osdev 社区中,C 通常被称为高级语言。而更“低级”的语言将是汇编语言(您被迫在内核启动时使用 ASM,因此您必须使用 ASM 但不必使用 C)。
Windows 上的内核模式开发支持 C++,但您不能轻易使用异常和 RTTI。我相信今天没有理由用 C 编写代码,因为 C++ 的开销可以忽略不计(任何跟踪/调试基础设施都将比虚拟函数调用的额外取消引用更昂贵)。事实上,大多数 Windows DDK 都使用 C 实现面向对象的模式,这与 C++ 相比只是不方便。
如果您决定使用 C++ 进行内核模式开发,则需要覆盖 new 运算符来选择是在可分页内存还是不可分页内存上分配一个类。一些不错的宏在那里可能会派上用场。
如果您正在谈论的是内核,那么您需要学习一种能够更快地轻松访问底层硬件的语言。我只能想到
- C语言和
- 集会
AFAIK,引导加载程序的某些部分将用汇编语言编写,从那时起,将使用 C 语言编写。有许多易于理解的开源操作系统可用,例如最新的 TOPPERS。试着调查一下。
我想,作为一名操作系统内核开发人员,您将更多地担心有效访问底层硬件(如处理器和内存)的方法,而不是语言的选择。我敢打赌,大多数时候,我们会很想使用汇编
我从 Pascal 语言的作者Niklaus Wirth那里指出了Oberon 编程语言和Oberon 操作系统。Niklaus Wirth 项目也有一个粉丝网站。
如果我正确理解了Андрей Николаевич Терехов,Ada 的一个好处是内存访问检查可以从 CPU 硬件转移到编译器级别,这减少了 CPU 中的逻辑门数量,这反过来又从能源消耗的角度来看是有益的看法。CPU 需要的逻辑门越少,可以从相同数量的逻辑门中创建更多的内核。从这个角度来看,专门为一种语言量身定制的 CPU,其中编译器替换了部分硬件,在每瓦操作数方面具有根本优势。
我已经在 Windows NT 和 Linux 内核中进行了大量的编程。我可以向你保证,只要这两个操作系统围绕 C 语言,就会在内核中使用。我认为原因有很多,但最简单的答案是时间。就像之前的海报提到的那样,用不同的语言重写内核所花费的时间是不值得的。它不仅仅是移植代码。内核需要一些认真的设计修改。我个人认为 C 是最适合内核的语言。当您在内核中工作时,能够管理您的开放内存并动态分配和释放您自己的内存是至关重要的。特别是如果您正在使用分页内存。在内核模式下分配的堆栈大小通常也小于用户模式,因此内存效率再次至关重要。C 还允许程序员构建漂亮的数据结构,这些数据结构不包含托管语言所具有的所有臃肿开销。在我看来,结构也可以像对象一样有效地使用,但又没有所有臃肿的开销。托管语言也需要“托管”。在内核中,您没有任何东西可以清理您的混乱。不要误会我的意思,我喜欢 C#,我认为 .NET 框架很漂亮,但如果你在内核中,C 是并且将继续是它。在内核中,您没有任何东西可以清理您的混乱。不要误会我的意思,我喜欢 C#,我认为 .NET 框架很漂亮,但如果你在内核中,C 是并且将继续是它。在内核中,您没有任何东西可以清理您的混乱。不要误会我的意思,我喜欢 C#,我认为 .NET 框架很漂亮,但如果你在内核中,C 是并且将继续是它。
明确地!您还应该学习至少一种汇编语言/硬件架构。
你绝对应该精通 C 语言。
正如其他人所指出的,没有理由必须用 C 编写操作系统,并且通过使用更复杂的语言可以获得很多好处。但是,如果您要在现实世界中(即,不在学术界或研究实验室)研究操作系统,那么您必须面对几个现实:
- 现有的操作系统非常庞大,通常有数百万行代码,并且是用 C 或 C 衍生物(例如 Objective-C 或 C++)编写的。
- 新操作系统需要数百个工程师年(和许多日历年)才能达到并匹配现有操作系统的功能和稳健性。
因此,我很难看出世界将如何以及何时远离基于 C 的操作系统内核。是的,这在技术上是可行的。但是成本可能太高了。如果有的话,趋势似乎是在少数操作系统系列(Windows、Linux 和 BSD)上进行整合,这些都是基于 C 的。
知道已经完成了哪些研究,或者可以使用哪些工具和技术将现有的代码库(例如 Linux)发展为更好的语言,将会很有趣。我认为这将是一种比让世界采用全新的操作系统更可行的方法。