目前,我正在研究在内核空间中运行 jvm 的想法,作为(可能是 Linux)内核模块。我看到这个想法有很多优点。
当然,这种系统的最大优点是内核空间开发的极大简化。但它的发生是因为不同的方面:
1)每个具有相对较少底层知识的java开发人员都能够开发内核模块。是的,这肯定不是一个好的可能性:-),特别是如果我们看到大多数开源 java 用户空间项目的当前代码质量,但是......没有必要在内核空间中发生同样的情况。
2)(也是真正的预期目标):JVM可以解决内核开发最大的问题,就是缺乏内存保护。如果没有其他问题(fe jit 编译器错误或低级硬件问题),从 java 编译的二进制代码段永远不会对超出其范围的数据结构造成任何损害,尽管此类二进制代码的运行时安全检查会造成很好的影响。速度上的明显缺陷。
首先,它也不需要是 java 字节码解释器。 JIT(即时编译器)可以存在于系统用户空间上,仅将编译后的二进制文件(实际上:内核模块)映射到内核空间中。只有命名空间管理器和垃圾收集器需要在内核空间中运行。
其次,它不需要很大、很慢、很可怕。这是因为在用户空间 jvm 的情况下,使用了大的、无效使用的库,并且在例如以下情况下没有理由使用相同的库:用java编写的驱动程序。
我能看到的唯一后退是实时功能。当然,用 java 来做到这一点要困难得多,因为我们对内存管理的次要细节的控制要少得多。
我很好奇,如果这样的项目已经存在(?#1),如果不存在的话,是否有任何明显的重大后备(?#2)。
答案1
我认为这将是一个非常大的项目,因为你需要一个 JVM 实现用C写的使用内核 API 的自定义部分。 openjdk的热点是显然 250K+ LOC在 C 和 C++ 中。请注意,您不能将 C++ 与 Linux 内核一起使用。
我认为这可以解决很多问题人年来实施。您不太可能将其包含在官方源代码树中,但这并不是什么大问题。
考虑到与您所说的“最大优势”相关的规模:
当然,这种系统的最大优点是内核空间开发的极大简化。
我不确定你的意思是什么。对于那些可以用 Java 而不能用 C 编写代码的人来说,我想这显然是正确的。但如果你的意思是一般意义上的,我不明白为什么会这样。我对 C 和 Java 都很满意,并且对其中之一没有强烈的偏好(上下文或其他人往往会为我做出这个决定)。也许 Java 稍微容易使用一些,因为,例如,您不需要做 MM(但是 MM 真的那么难吗?)等等——但在我看来,它也可能看起来更尴尬和受限制。
就我个人而言,我不认为这是一个值得追求的事情,但这并不意味着我认为这是不可能的,或者是一个坏主意。你的主要障碍将是找到其他人来做出贡献。
答案2
拥有内核内 JVM 似乎并不能解决太多问题。虽然确实缺乏指针,但确实提供了独立代码片段的合理隔离,但它也会引入 Java 字节码解释器(永远比本机代码慢)或 JIT 编译器(一开始就非常慢)。我没有提到垃圾收集器,我怀疑您可能希望自动解决一些问题(但它不会)。
另一个需要解决的问题是连接任何硬件。您需要一段相当复杂的代码,以便 Java 代码能够访问网卡、SATA、(i)SCSI、USB、光纤通道和无数其他控制器、声卡和(我想这是最棘手的部分之一)图形加速器。这将导致大量代码用另一种更接近裸机的语言编写(无论是汇编语言还是 C/C++ - 实际上,这只不过是一种具有更高抽象级别的更易读的汇编语言)。
最后,如果用 Java 编写内核代码是最终目标,那么人们可能会决定采取稍微不同的做法:用 Java 编写并直接编译为本机代码。
1)每个具有相对较少底层知识的java开发人员都能够开发内核模块。
编写内核模块,在 90% 的情况下是与硬件相关,需要的不仅仅是“次要”硬件知识。了解 Java 但不深入了解 C 的人绝对不是编写硬件驱动程序(或任何其他内核模块)的合适人选。
从另一个角度来看:您是否信任您最重要的数据(我什至不是在谈论由这样的内核控制的生命支持)到在编写的内核上运行的东西由不懂 C 和汇编的人编写足够写一个合理的驱动程序了吗?
2)(也是真正的预期目标):JVM可以解决内核开发最大的问题,就是缺乏内存保护。如果没有其他问题(fe jit 编译器错误或低级硬件问题),从 java 编译的二进制代码段永远不会对超出其范围的数据结构造成任何损害,尽管此类二进制代码的运行时安全检查会造成很好的影响。速度上的明显缺陷。
使用 JIT 进行内存保护?它要求页面既可写又可执行。即使它缺乏直接内存访问(在能够使用指针的意义上),这也是一个安全噩梦。
如果您关心安全性(以及其他代码隔离),那么微内核就是您所追求的。你甚至可以拥有一个正式验证。再说一次,代码只能与最差的程序员一样好,而在最好的情况下,代码仍然存在。语言本身并不重要,重要的是使用它的人。
顺便说一下,我强烈建议阅读这个关于各种语言的系统编程的答案就这样。