可以用Java编写设备驱动程序吗? 介绍

可以用Java编写设备驱动程序吗? 介绍,java,operating-system,device-driver,Java,Operating System,Device Driver,我听说了一些关于用Java编写设备驱动程序的事情(听上去像是“用我的耳朵”,而不是从互联网上),我想知道。。。我一直认为设备驱动程序是在操作系统级别上运行的,因此必须使用与操作系统相同的语言编写(因此我认为大部分是C) 问题 我一般都错了吗 假设?(似乎如此) 一个“外星人”的司机怎么可能 操作系统中使用的语言? 要求是什么 (从编程语言的角度) 对于设备驱动程序? 感谢您阅读您可能听说过有关 如果没有本机代码来提供(1)特定于操作系统的驱动程序入口点和约定,以及(2)JVM实例之间的交互,1

我听说了一些关于用Java编写设备驱动程序的事情(听上去像是“用我的耳朵”,而不是从互联网上),我想知道。。。我一直认为设备驱动程序是在操作系统级别上运行的,因此必须使用与操作系统相同的语言编写(因此我认为大部分是C)

问题
  • 我一般都错了吗 假设?(似乎如此)
  • 一个“外星人”的司机怎么可能 操作系统中使用的语言?
  • 要求是什么 (从编程语言的角度) 对于设备驱动程序?


  • 感谢您阅读

    您可能听说过有关


    如果没有本机代码来提供(1)特定于操作系统的驱动程序入口点和约定,以及(2)JVM实例之间的交互,100%用Java编写设备驱动程序是不可能的。JVM实例可以“在进程中”启动(“在进程中”可能有不同的含义,具体取决于操作系统和驱动程序是内核模式还是用户模式驱动程序),也可以作为一个单独的用户登录进程启动,本机驱动程序适配层可以通信,并且所述驱动程序适配层可以在其上卸载实际的用户土地工作。

    这不是不可能的,但可能很难,也可能没有多大意义

    这是可能的,因为Java是一种普通的编程语言,只要您有某种方式访问数据,就没有问题。通常在现代操作系统中,内核有一层允许以某种方式对硬件进行原始访问。用户空间中也已经存在驱动程序,至少用户空间部分在Java中实现应该没有问题

    这可能没有太大意义,因为内核必须启动JVM来执行驱动程序。另外,JVM实现通常会占用大量内存

    您还可以使用编译后在平台上本机执行的Java代码(不需要JVM的帮助)。这通常不是很有效,但它可能适用于设备驱动程序

    问题是,用Java实现驱动程序有意义吗?或者用另一种方式说:如果您使用Java来实现驱动程序而不是其他替代方案,您希望获得什么好处?如果你能回答这个问题,你应该想办法让它成为可能


    最后提示,一个试图实现完全基于Java的完整操作系统的项目。

    可以将Java代码编译成硬件本机(即,不是JVM字节码)指令。例如,见。有了这个,您比以前更接近能够编译设备驱动程序


    不过,我不知道它有多实用。

    设备驱动程序必须用一种可以在内核中执行的语言编写,或者编译成内核,或者在运行时作为模块加载。这通常不允许用Java编写设备驱动程序,但我认为理论上可以在设备驱动程序中实现JVM,并让它执行Java代码。并不是说任何理智的人都想这么做


    在Linux上,有几种文件系统的用户端(即非内核)实现,它们使用一个称为(fuse)的通用抽象层,允许用户端程序实现通常在内核中完成的事情。

    可能吗?

    是的,但只有在特殊情况下。因为您可以用Java和C编写操作系统,然后应该能够为其编写设备驱动程序。对这些驱动程序和操作系统的内存冲击将是巨大的

    可能性?

    不太可能。至少在Windows、MacOS甚至Linux的世界里都没有。。。至少不会很快。因为像C#和Java这样的语言依赖于CLR和JVM。这些语言的工作方式意味着它们无法有效地加载到ring0中


    此外,如果在设备驱动程序中使用托管语言,性能损失将相当大

    首先,请注意,我不是设备驱动程序方面的专家(尽管我自己也写了一些),更不用说Java方面的专家了

    让我们暂时把用高级语言编写设备驱动程序这一事实放在一边,然后回答您的问题

    您可以用几乎任何语言编写设备驱动程序,至少在理论上是这样


    然而,大多数设备驱动程序都需要做大量的底层工作,比如处理中断以及使用操作系统API和系统调用与操作系统通信,我相信这在Java中是做不到的

    但是,如果您的设备使用串行端口或USB进行通信,并且如果操作系统不一定需要知道该设备(只有您的应用程序才能访问该设备*),则您可以使用提供访问该设备所需手段的任何语言编写驱动程序

    例如,您可能无法用Java编写SCSI卡驱动程序,但可以为专有控制设备、USB熔岩灯、许可证加密狗等编写驱动程序


    *当然,这里的一个明显问题是,这算不算驱动因素?

    有几种方法可以做到这一点

    首先,在“操作系统级”运行的代码不需要使用与操作系统相同的语言编写。它只需要能够与操作系统代码链接在一起。实际上,所有语言都可以与C进行互操作,这是真正需要的

    因此,就语言而言,技术上没有问题。Java函数可以调用C函数,C函数可以调用Java函数。如果OS不是用C编写的(比如说,为了用C++编写的参数),那么OS C++代码可以调用一些中间的C代码,这些代码转发给java,反之亦然。C语言几乎是编程的通用语言

    一旦一个程序被编译(为本机代码),它的源语言就不再相关了。不管使用哪种语言,汇编程序看起来都差不多