是否可以在 Java 中对设备驱动程序进行编码?

2022-09-01 19:54:28

介绍

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

问题

  1. 我通常对这个假设是错误的吗?(看来是这样)
  2. 如何在操作系统中使用“外星”语言的驱动程序?
  3. 设备驱动程序的要求(从编程语言的角度来看)到底是什么?

感谢您的阅读


答案 1

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

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

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

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

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

不幸的是,在其“默认”表示形式中,作为Java字节码,Java程序需要大量的基础设施。它需要Java VM来解释和JIT字节码,它需要类库等等。

但是有两种方法可以解决这个问题:

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

所以,是的,这是可以做到的。但这并不简单,也不清楚你会得到什么。

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


答案 2

用 Java 编写 Solaris 设备驱动程序会覆盖用 Java 编写的 RAM 磁盘设备。

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


推荐