对于内核/操作系统来说还是C呢?

时间:2009-05-14 02:12:51

标签: operating-system kernel osdev

我喜欢操作系统,最终希望成为一名主要从事内核工作的操作系统开发人员。在未来,C仍然是首选语言,我还应该学习什么?

17 个答案:

答案 0 :(得分:37)

在研究人群中,有很多人对使用基于语言的技术保证内核无法行为不端感兴趣。许多人提到了Singularity项目,该项目目前具有(当之无愧)高调。为什么奇点有趣?

  • 该语言包括正确使用锁的有限状态模型。编译器可以针对模型对代码进行模型检查,以确保死锁不会发生

  • 第三方驱动程序的系统界面有限。编译器完成的检查可以确保一个坏的驱动程序无法取出系统 ---它可以做的最糟糕的事情就是淘汰自己的设备。

  • Singularity使用编译器技术而非OS / MMU技术将一个“进程”与另一个“进程”隔离开来。突然分叉一个新的“过程”(真的是一种新的protection domain)是便宜的,这种廉价使新的设计成为可能。

Singularity只是使用语言和编译器技术解决操作系统问题的一长串项目中的最新版本。我最喜欢的一个是华盛顿大学SPIN kernel,它允许应用程序安全地扩展内核并用Modula-3编写。

这个研究领域仍然是开放性的,并且目前还不知道哪些语言或编译器功能是解决操作系统问题的“最佳点”。所以回答你的问题:

  • 今天的制作系统中,C仍然是“它”。

  • 对于未来的操作系统,C几乎肯定不是“它” - 我们知道它可以做得更好 - 但新的“它的确切性质”它“仍然是一个悬而未决的问题。

答案 1 :(得分:10)

我认为可以肯定地说,由于速度的原因,操作系统的低级部分(例如内核)将继续用C语言编写。就像在别处提到的那样,你需要知道内核某些部分的汇编程序(需要将内核加载到内存中)。但是你可以在很少或没有汇编知识的情况下使用内核。一个很好的例子就是如果你正在实现一个文件系统。

不要担心操作系统的实现语言。重要的是如何使用操作系统,以及可以采取哪些措施来改进它们。一个很好的例子是Unix首次问世。文件系统在磁盘前面有inode,在剩余空间中有数据。由于您正在为所有文件寻找磁盘的不同部分,因此效果不佳。然后创建Berkeley Fast File System以创建磁盘感知文件系统。这意味着在其相应数据附近有inode。我遗漏了很多细节,但我希望这说明考虑如何改进操作系统而不是编程语言更为重要。

操作系统最近的一些趋势是虚拟化和分布式计算(参见Google关于MapReduce的论文)。即使这些问题不是新问题,文件系统,安全性,调度(尤其是多核处理器)等也是不断感兴趣的领域。

如果您想了解有关内核开发的更多信息,请参阅以下资源:

  • Linux Kernel Newbies - 那些想要开始修改Linux内核的人的资源。
  • xv6 source - Unix版本6的x86端口。由MIT用于教授操作系统类。简单,易于扩展(more info)。
  • Linux Kernel Map - 在Linux中调用系统调用链。用于可视化系统调用的功能。

结论:开始熟悉内核并阅读研究人员正在撰写的论文(USENIX对此有用)。这种知识比学习一门新语言更有价值,因为如果确实发生了什么操作系统的转变,一种语言的大多数概念都可以很容易地转移到另一种语言。希望这有帮助!

答案 2 :(得分:6)

科迪不想被这个问题困扰,所以我代表他传递了这个。 :-P有关使用托管语言编写的操作系统的一些示例,而不是C或汇编,请查看:

当然,科迪也不想提这个:

答案 3 :(得分:3)

C几乎就是它,有相当数量的汇编程序。 OS内核工作的重要主题包括:

  • 缓存和缓存管理的原则
  • 虚拟内存,TLB管理
  • CPU和系统架构
  • 存储层次结构
  • 并发编程技术(互斥,锁定......)
  • 算法和数据结构

答案 4 :(得分:3)

Actualy,现代操作系统C ++代码的核心有相当大的空间。我只是看,Win7核心内核树有相当多的C ++代码。请注意,许多子系统仍保留在简单的C中。这有几个原因

  1. C是基于NT的操作系统的原始语言
  2. C非常非常了解关键人物
  3. 编写良好的C可以是最直接的代码来调试 - 特别是在内核模式下。
  4. 话虽这么说,许多团队和人员已经发现编写良好的C ++是核心操作系统工作的有效工具。

    C ++没有任何东西阻止它被用来编写核心资源管理代码,如调度程序,内存管理器,I / O子系统,图形子系统等。

    正如其他人所指出的那样 - 任何内核工作总是需要一些汇编语言。

答案 5 :(得分:1)

微软正在用.NET重写一些Windows,但我怀疑是否会触及很多内核。

然而,像Cosmos(http://www.gocosmos.org/index.en.aspx)这样的项目给了我们希望。

答案 6 :(得分:1)

不,它不是“它”。内核通常用C语言编写,并带有一些汇编程序。但操作系统是用各种语言编写的。但即便如此,C ++也可以毫不费力地使用。许多其他语言也可以。 Linux是由C狂热分子编写的,他们害怕并厌恶其他一切,这是他们的问题。 Windows是用C和C ++的大量组合编写的,并且可能还带有一些旧的Pascal代码。而现在,.NET的大块也出现了。 OS X对大部分操作系统代码使用Objective-C。

同样的建议适用于所有其他编程领域:

  • 了解你的东西
  • 不要仅限于一种真实的语言。

内核是唯一适用某些“特殊”规则的区域。但是内核很小。绝大多数操作系统都可以用任何语言编写。

你肯定需要知道C,是的,但只是知道C远远不够。

答案 7 :(得分:1)

您可能希望查看Microsoft的Singularity项目(也在Wikipedia上):

  

Singularity是一个由Microsoft Research自2003年以来构建的实验性操作系统。它旨在作为一个高度可靠的操作系统,其中内核,设备驱动程序和应用程序都是用托管代码编写的。

这个操作系统的极小部分实际上是用C语言编写的,其余部分是用更高级的语言编写的(Sing#,C#的扩展名)。在未来,我相信你可以期待看到更多这种东西可用。

答案 8 :(得分:1)

我认为可以肯定的是,在可预见的未来,严重(非实验性)操作系统开发将保留在C(和汇编)中。

我提交的证据是Ada。它可以像C一样裸机,提供对数据放置的更好控制,并且几乎对所有事物都有更安全的默认行为(例如:数组边界检查)。从操作系统开发人员的角度来看,它可以在您想到的任何技术参数中等于或优于C。它已经有20多年了(好吧......价格合理,可能只有15个)。

因此,如果人们在为C语言寻找技术上优越的语言,那么你应该看到用Ada编写的所有操作系统都是正确的吗?我实际看到的是在Ada中实现的一个严重操作系统。它不再支持在C中重新实现。

操作系统开发中其他语言的障碍不是,也从来都不是技术性的。我不认为C的非技术性好处很快就会消失,没有人能够通过简单地设计一种更好的语言而 去克服它们。

答案 9 :(得分:0)

很多时候,你可以听到一些说法:C语言是速度和Ada的同义词,而不是。 这不是真的。 Ada添加了一些减慢执行速度的检查。这是真的,但出于调试目的或安全性。因此,可以在编译时通过配置删除它们。因此,您可以无需开销即可生成ADa程序。 另一方面,请注意gnu编译器在相同的中间代码中转换Ada和C. 因此,您在最后获得相同的可执行代码。 我在这里读到Ada不能用于开发驱动程序。那是假的。 Ada具有与C语言相同的功能。 更多,它避免了许多错误。 你可以看到它存在一个实时操作系统,MarteOS,完全用Ada编写。

为什么Ada不用于编程OS内核的主要原因是C语言是用于Unix的语言。它是一个POSIX规范,系统调用API用C原型表示。 所有操作系统片段都已用C语言编写。而且,C语言占全球开发软件的17%。

最后,Ada很严格,很多人不喜欢这个。他们更喜欢开发具有漏洞的软件并花更多时间进行调试。

答案 10 :(得分:0)

我指出了Pascal语言作者Oberon programming languageOberon operating systemNiklaus Wirth。 Niklaus Wirth项目还有一个fan site

如果我正确理解Андрей Николаевич Терехов,Ada有一个好处,即内存访问检查可以从CPU硬件转移到编译器级别,这会减少CPU中的逻辑门数量,这反过来又是有益的从能源消费的角度来看。 CPU需要的逻辑门越少,从相同数量的逻辑门创建的内核就越多。从这个角度来看,专门针对某种语言定制的CPU-s,编译器取代了部分硬件,在每瓦特的操作数方面具有根本优势。

答案 11 :(得分:0)

嗯,在osdev社区中,C通常被称为高级语言。更多"低级"语言将是汇编(你必须在内核的开头使用ASM,所以你必须使用ASM,但你不必使用C)。

答案 12 :(得分:0)

Windows支持内核模式开发的C ++,但不能轻易使用异常和RTTI。我相信今天没有理由在C语言中编写代码,因为C ++的开销可以忽略不计(任何跟踪/调试基础结构都比虚拟函数调用的额外解引用成本高得多)。事实上,大多数Windows DDK都使用C实现了面向对象的模式,与C ++相比,这只是不方便。

如果您决定使用C ++进行内核模式开发,则需要覆盖new运算符以选择是否在可分页或不可分页内存上分配类。一些不错的宏可能会派上用场。

答案 13 :(得分:0)

我在Windows NT和Linux内核中都进行了大量的编程。我可以向你保证,只要这两个操作系统在C周围,就会在内核中使用。我认为这有很多原因,但最简单的答案就是时间。像之前的海报一样,提到用不同语言重写内核所需的时间并不值得。它不仅仅是移植代码。内核需要进行一些严格的设计修改。我个人认为C是最适合内核的语言。在内核中工作时,能够管理开放内存并动态分配和释放自己的内存是至关重要的。特别是如果你正在使用分页内存。在内核模式下分配的堆栈大小通常也小于用户模式,因此内存效率也至关重要。 C还允许程序员构建漂亮的数据结构,这些数据结构不包含托管语言所具有的所有膨胀开销。在我看来,结构也可以像对象一样有效地使用,但同样没有所有膨胀的开销。托管语言也需要“管理”。在内核中,你没有任何清理你的混乱的东西。不要误解我的意思,我喜欢C#,我认为.NET框架很漂亮,但是如果你在内核C中并且将继续存在它。

答案 14 :(得分:0)

你一定能说一口流利。

正如其他人所指出的那样,没有必要用C语言编写操作系统,并且使用更复杂的语言可以获得很多东西。但是,如果您要在现实世界中操作系统(即,不是在学术界或研究实验室中),那么您必须面对一些现实:

  1. 现有的操作系​​统是巨大的,通常是数百万行代码,并且是用C或C衍生物编写的,例如Objective-C或C ++。
  2. 新操作系统需要数百个工程师年(以及许多日历年)才能达到并匹配现有操作系统的功能和稳健性。
  3. 因此,我很难看到世界将如何以及何时摆脱基于C的操作系统内核。是的,这在技术上是可行的。但成本可能太高了。如果有的话,趋势似乎是针对少数操作系统家族的整合 - Windows,Linux和BSD--都是基于C的。

    了解已经完成的研究,或者可以使用哪些工具和技术将现有的代码库(如Linux)发展为更好的语言将会很有趣。我认为这比采用全新的操作系统更加可行。

答案 15 :(得分:0)

如果它是您正在讨论的内核,那么您需要学习一种能够更快地轻松访问底层硬件的语言。我只能想到

  • C语言和
  • 装配

AFAIK,boot-loader的某些部分将以汇编语言编写,从那时起,C。有许多开源的易于理解的操作系统,例如最新的TOPPERS。试着调查一下。

我想,作为操作系统内核开发人员,您会更加关注有效访问底层硬件(如处理器和内存)的方法,而不是选择语言。我打赌,大多数时候,我们会试图使用汇编

答案 16 :(得分:0)

绝对是最好的!您还应该学习至少一种汇编语言/硬件架构。