是否可以用Java编写设备驱动程序?

Phi*_*ark 22 java operating-system device-driver

介绍

我听说过用Java编写设备驱动程序(听说"用我的耳朵",而不是来自互联网)并且想知道......我一直认为设备驱动程序在操作系统级别上运行,因此必须用同一种语言编写作为操作系统(因此主要是CI假设)

问题

  1. 这个假设我一般都错了吗?(看起来如此)
  2. 如何在操作系统中使用"外星人"语言的驱动程序?
  3. 无论如何,对于设备驱动程序有什么要求(从编程语言的角度来看)?

谢谢阅读

jal*_*alf 20

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

首先,在"OS级别"运行的代码不需要用与OS相同的语言编写.它只需要能够与OS代码链接在一起.事实上,所有语言都可以与C互操作,这实际上就是所需要的.

语言方面,技术上没有问题.Java函数可以调用C函数,C函数可以调用Java函数.如果操作系统不是用C语言编写的(比如说,为了论证它是用C++编写的),那么OS C++代码可以调用一些中间的C代码,它们转发到Java,反之亦然.C几乎是编程的通用语言.

一旦程序编译(到本机代码),其源语言就不再相关.无论在编译之前编写源代码的语言是什么,汇编程序看起来都大致相同.只要您使用与操作系统相同的调用约定,就没有问题.

更大的问题是运行时支持.操作系统中没有很多软件服务可用.例如,通常没有Java虚拟机.(没有理由在技术上不可能,但通常,但通常,假设它不存在是安全的).

不幸的是,在其"默认"表示中,作为Java字节码,Java程序需要大量的基础结构.它需要Java VM来解释和JIT字节码,它需要类库等等.

但是有两种方法:

  • 在内核中支持Java.这将是一个不寻常的步骤,但它可以做到.
  • 或者将Java源代码编译为本机格式.Java程序不必编译为Java字节码.您可以将其编译为x86汇编程序.您使用的任何类库都是如此.那些也可以编译到汇编程序.当然,Java类库的某些部分需要某些不可用的OS功能,但是可以避免使用这些类.

是的,它可以做到.但这并不简单,而且不清楚你会获得什么.

当然另一个问题可能是Java不允许你访问任意内存位置,这会使很多硬件通信变得非常棘手.但也可以通过调用非常简单的C函数来解决这个问题,这些函数只是将相关的内存区域作为Java的数组返回.

  • +1:非常有见地,但是你忘了提到虽然它可能在大多数情况下仍然非常疯狂. (3认同)
  • 让我再一次问一下,对于你这个问题,你有没有*点*?我所说的非常简单:你*可以*将必要的运行时服务嵌入到驱动程序中,然后你*可以用Java编写你的驱动程序.您可以使用简单的引用计数机制替换GC(并添加一个中断循环的机制).你究竟想要证明什么?你究竟反对什么?除非你有什么*新*来讨论这个问题,否则我认为我们已经在这里完成了. (2认同)

Tof*_*eer 19

用Java编写Solaris设备驱动程序包括用Java编写的A RAM磁盘设备.

Linux的另一个.更深入地了解为什么你可能也想要Java中的DD(因为有些人对其他帖子和评论的外观感到疑惑)


bvd*_*vdb 5

设备驱动程序可能有很多东西

我实际上以 Java 编写设备驱动程序为生:工业设备的驱动程序,例如秤或称重设备、包装机、条码扫描仪、称重桥、袋和箱打印机,...... Java 在这里是一个非常好的选择。

一些例子

工业设备与您的家庭/办公设备(例如扫描仪、打印机)很大不同。特别是在制造业(例如食品),公司越来越多地选择运行 MES 应用程序(例如用 Java 开发)中央服务器。 MES 服务器需要与生产线的设备接口,但也包含业务逻辑。Java 是一种可以做到这两者的语言。

在您的家庭/办公设备通常内置于计算机或通过 USB 电缆连接的情况下,这些工业设备通常使用以太网或 RS232 连接器。因此,从本质上讲,几乎每种语言都可以完成这项工作。

在这方面还没有太多的标准化。大多数供应商更喜欢为他们的设备创建自己的协议。毕竟他们是硬件制造商,而不是软件天才。结果是协议的多样性很高。一些供应商更喜欢简单的纯文本协议,但其他供应商更喜欢带有 CRC 代码、成帧等的复杂二进制协议……有时他们喜欢堆叠多个协议(例如,在 OPC 层之上的供应商特定握手算法)。强大的 OOP 语言在这里有很多优势。

例如,我已经看到 java 以 100 毫秒/周期的连续速度打印。这包括生成唯一标签、将其发送到打印机、接收确认、将其打印在纸上并使用气压将其应用到产品上。

总结一下java的强大:

  • 它对业务逻辑和复杂接口都很有用。
  • 它在与套接字通信方面与 C 一样可靠。
  • 一些驱动程序可以从 Java 的 OOP 功能中受益。
  • Java 已经足够快了。