【问题标题】:Using ngen.exe to compile a kernel使用 ngen.exe 编译内核
【发布时间】:2011-07-29 10:52:18
【问题描述】:

我知道 Cosmos 和 SharpOS 已经制作了自己的编译器来从 C# 构建二进制代码,但是您可以使用 Microsoft 的 .NET AOT 来做同样的事情吗?将 C# 编译为 x86,即。我假设您将不得不省略 using 语句,就像操作系统开发中包含语句一样。 任何反馈表示赞赏。谢谢

编辑:我想在内核开发中使用 C# 的主要原因是托管代码带来的内存管理,尤其是单个地址空间属性。是否有必要启动 JIT 编译器,然后编译 C#?还是当时的环境仍然太残缺?感谢反馈

【问题讨论】:

  • 你的意思是你想写一个内核,但是内核开发的所有特性都为你处理好了吗?那么你最好使用现有的内核。这就是他们的目的。

标签: c# osdev ngen


【解决方案1】:

简短回答:不,使用 ngen.exe / AOT 编译器不足以编译内核。

长答案:ngen.exe / AOT 编译器消除了 JIT 编译器的工作,但 CLR 不仅仅是一个 JIT 编译器 - 即使不引用任何其他程序集,它也提供内存管理、垃圾等功能收集、类型检查和异常处理(以及其他一大堆东西)。

是的,使用 ngen 确实让您更接近于在 C# 中生成内核,但它并没有让您更接近 - 您仍然需要解决一大堆其他问题,这些问题更容易通过编写来解决针对您的预期环境(而不是 CLR)的编译器。

更新:如果您想要 C# 的“托管”部分,那么您需要为自己创建一个托管环境来运行您的代码,即垃圾收集器等...(或尝试获取像 CLR 一样存在,这可能会更困难)。这是一项非常艰巨的任务,即使 有底层操作系统的支持,当您操作系统时,这样做更是如此(尽管这绝不是不可能的 - 毕竟这是正是 Singularity 和 Cosmos 等项目所做的)。

【讨论】:

  • 我还没有放弃,但这确实回答了有关 ngen 的问题。谢谢
  • @apophis 如果您刚刚开始进行内核开发,那么您可能应该从更“传统”的语言开始,例如 C、C++ 或汇编。
【解决方案2】:

不,你不能用 ngen 做到这一点。 ngen 输出本身不够低级,无法在没有所有支持的 CLR 和 Windows 基础设施的情况下启动内核。

您提到的其他项目将 CLR 的子集编译为二进制文件,这是一个略有不同的过程。

【讨论】:

    【解决方案3】:

    你不能。 C# 是一种托管语言,这意味着它的代码(IL 代码)将在运行时编译......您可以编写自己的编译器,将 C# 编译为本机计算机代码,但这会让您没有很多 .NET 的功能有,例如垃圾收集器、内存管理、JIT 编译器,并且将类似于 C++,只是使用 C# 语法

    作为一个抽象的想法,我认为您可以使用 JIT 编译器和垃圾收集器创建一个小的 CLR 替代方案,它将嵌入到您的应用程序中,但这会增加您的应用程序大小并且您需要更多资源...

    【讨论】:

    • 有点对,但大多不是——当人们说 C# 是一种托管语言时,他们的意思是它通常在托管环境(如 CLR)的上下文中运行,但不是语言本身使其管理,它的运行时。正如您可以将 C++ 代码编译为 IL(称为托管 C++)一样,您可以(至少在理论上)将 C# 编译为完全原生的输出。
    • 我认为不是托管环境使语言托管,而是编译成托管代码的编译器,正如我所说,您可以编译为本机代码,但您将无法运行 CLR 功能,例如因此,作为车库收集器,您应该担心内存管理等问题,并且您必须编写更多代码,至少是对象的析构函数
    【解决方案4】:

    我发现了这个resource 用于将 IL 编译为本机代码,用于 cosmOS 项目

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2013-08-21
      • 2017-03-09
      相关资源
      最近更新 更多