使用ngen.exe编译内核

时间:2011-07-29 10:52:19

标签: c# osdev ngen

据我所知,Cosmos和SharpOS已经制作了自己的编译器来构建C#的二进制代码,但你能否使用微软的.NET AOT来做同样的事情呢?将C#编译为x86,即。我假设您将不得不遗漏使用语句,就像包含语句时的OS开发一样。 任何反馈意见。感谢

编辑:我想在内核开发中使用C#的主要原因是托管代码带来的内存管理,尤其是单地址空间属性。是否有必要引导JIT编译器,然后编译C#?或者那时的环境是否仍然过于瘫痪?感谢您的反馈

4 个答案:

答案 0 :(得分:5)

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

答案很长:ngen.exe / AOT编译器会删除JIT编译器的工作,但CLR不仅仅是一个JIT编译器 - 即使没有引用任何其他程序集,它也提供内存管理,垃圾等内容集合,类型检查和异常处理(以及其他一些东西)。

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

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

答案 1 :(得分:0)

不,你不能用ngen做到这一点。 ngen输出本身并不足以在不支持所有支持CLR和windows基础设施的情况下启动内核。

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

答案 2 :(得分:0)

你做不到。 C#是一种管理语言,这意味着它的代码(IL代码)将在运行时编译...您可以编写自己的编译器,将C#编译为本机计算机代码,但这将使您没有.NET的许多功能有,如垃圾收集器,内存管理,JIT编译器,并将使用C#语法,就像C ++一样

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

答案 3 :(得分:0)

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