我从来没有做过内核编程。我是 Java 语言的优秀程序员并且经常使用它。现在我觉得用内核做一些有趣的事情。内核位于硬件和操作系统之间。它使用系统调用与硬件通信。每种编程语言都需要一个编译器来编译用高级语言编写的代码,然后生成低级代码,通常是汇编语言代码。我的疑问来了,如果我们有用 C 编写的内核,那么我们是否应该在机器上安装 C 编译器?最后,当内核与硬件交互时,它使用汇编语言,我可以用 Java 语言创建内核吗?如果是,那么相同的要求是什么?谢谢你。
2 回答
内核位于硬件和操作系统之间
通常,内核被认为是操作系统的一部分。
它使用系统调用与硬件通信
系统调用是操作系统提供给用户应用程序的接口。操作系统通过其他机制(例如中断或内存映射寄存器)与硬件通信。
每种编程语言都需要一个编译器来编译用高级语言编写的代码,然后生成低级代码,通常是汇编语言代码。
编译器输出通常是本机机器代码或特定语言的字节码(如 Java)。有时,编译器还针对另一种编程语言,例如 C 或 Javascript(转译)。
我的疑问来了,如果我们有用 C 编写的内核,那么我们是否应该在机器上安装 C 编译器?
那没有必要。C 编译器产生的输出可以直接在硬件上执行而无需解释。
最后,当内核与硬件交互时,它使用汇编语言
CPU不理解汇编。它理解机器代码。
我可以用 Java 语言创建内核吗?
它已经完成了。
如果是,那么相同的要求是什么?
如果你想用 Java 编写内核,那么你要么必须
- 将整个 Java 代码库编译为机器码
- 给自己一个可以执行 Java 字节码的 CPU
- 找到或构建一个可以在裸机上运行的 Java VM 和运行时,并在其中运行你的 Java 代码(如果你做得聪明,你可以用 Java 本身编写大部分运行时,也可能是 VM 的一部分)。
现在到一个不言而喻的,几乎是修辞的问题:
这是一个好主意吗?
可能不是。为什么?首先,因为设置需要很长时间。其次,因为您不能仅仅按照开发普通业务应用程序的方式编写代码。您必须考虑非常时间关键代码的性能(例如上下文切换,这通常需要手动调整的程序集足够快),手动内存管理(例如:您的 MRU 可能希望您给它物理地址页表所在的位置),特定于系统/硬件的机制(如何访问此特定架构上的 XYZ 控制器?),...
因此,您首先会失去 Java 相对于 C 等低级语言的许多优势。
是的,可以用 Java 编写内核,请参阅JNode。它的优点是没有问题:悬空指针、指针和数组地址的混合、统一数据以及 C 的更多特性。