19

是否可以用 Javascript 编写硬件驱动程序?这样的任务需要哪些步骤?

另外,我不确定该在哪里发布,因此也欢迎对此提出任何建议。我希望这是问题的准确位置。

4

7 回答 7

26

不,不是。我的意思是,你可以通过编写一些将 Javascript 编译成 C 的东西来实现,但这太疯狂了。有点像试图将勺子用作电锯。

学习 C。这是适合这项工作的工具。

于 2012-08-22T17:12:01.570 回答
4

哦,天哪。写一个驱动程序js?为什么?C我的意思是,您可以为or中的某些内容编写一个 javascript 包装器C++,但您为什么要这样做呢?设备驱动程序在相当低的级别(硬件级别)与机器通信。Javascript没有。Javascript 是一种网络语言(嗯,主要是)。

正如 Rich Bradshaw 所说,这就像将勺子用作电锯一样。尽管对我来说,这更像是尝试将独木舟用作坦克。

于 2012-08-22T17:17:21.157 回答
3

哇,这个想法毫无意义,恕我直言,您选择一种编程语言来解决问题或任务,而不是相反。我使用设备驱动程序和操作系统内核相关的东西,但仅仅因为我可以在 CI 中编程,不要使用 C 来执行其他任务,例如我的嵌入式设备的 Linux 管理;相反,我使用高级别的东西,例如 Bash、Perl 或 Python(取决于我的心情 :))。

为什么对 js 感兴趣?实际上,您应该了解编程语言的内部原理以了解您要实现的目标,并且您还需要知道您的程序将如何与您的操作系统交互以与设备寄存器和中断等进行通信。

于 2012-08-24T05:30:35.980 回答
2

听起来很傻,但现在正在为各种物联网设备做这件事。但在我所见过的所有情况下,设备本身都包含 V8 JS 引擎的修改版本。Mozilla 手机公开了一个硬件访问接口,但它再次不是真正的“真实”设备驱动程序,而是向 JS 公开的骨架 API。

我强烈建议您学习 Object Pascal 或 C/C++,因为它们是唯一适合此类工作的真正“真实”语言。传统上 C 是最常用的语言,但 C 和 Pascal 本质上是相同的东西,但语法不同。C++ builder 和 Object Pascal 甚至共享相同的代码生成器,顶部有不同的解析器/词法分析器。

话虽如此,没有真正的理由可以在 NodeJS 中编写一些自定义驱动程序。在 Linux 下,许多硬件中间件最初是用 Python 编写的,然后才最终用 C 语言编写。所以一切皆有可能,只要有人调整了有关访问硬件的运行时。FreePascal 和 Python 使 Raspberry PI 1-2 上的 GPIO 访问变得轻而易举。但毫无疑问,真正的语言,如 C/C++ 和 Object Pascal 占据了上风。

“真实”的意思是编译成平台的机器代码,而虚幻的意思是像 python 和 javascript 这样的脚本引擎。

于 2016-02-28T01:22:19.600 回答
0

只要满足以下几个条件,任何语言都可以用来编写设备驱动程序:

  1. 直接内存访问。看看这个源代码:

https://patchwork.kernel.org/patch/8163061/

作为设备驱动程序,您可能直接访问虚拟内存或物理内存(在 DMA 的情况下),因此需要绕过 MMU 设置的虚拟内存。直接访问虚拟内存意味着您知道虚拟地址,并希望直接读取该地址。

Java 或 Javascript 没有任何语言结构可以直接通过已知地址读取内存。

  1. 汇编语言敏感任务:访问硬件经常需要特殊的汇编指令,比如禁用中断,或从一个 CPU 切换到另一个 CPU,或广播 CPU 间消息等。没有 Java 结构可以完成所有这些,甚至 C语。这就是为什么经常需要结合 C + 汇编的原因。但是没有办法将Java和汇编结合起来。

  2. 本机与解释语言:所有解释语言都必须通过解释器来执行该语言。在 Javascript 或 Java 中,您需要 JVM 来执行 Java。因此,如果您需要内核中的 Java,那么您将需要内核中的 JVM 解释器。这并非不可能——最近的 Linux 内核在内核中运行了一个 BPF 解释器,因此您在内核中运行了一个 BPF VM:

https://events.linuxfoundation.org/sites/events/files/slides/bpf_collabsummit_2015feb20.pdf

https://lwn.net/Articles/599755/

Java 作为设备驱动程序的想法之前已经实现,作为研究论文/项目(针对 Sun Solaris OS):

http://dl.acm.org/citation.cfm?id=1215998

http://www.c0t0d0s0.org/archives/2587-Device-driver-in-Java.html

但是我不确定直接内存访问的问题是如何解决的。

尽管如此,始终可以设计一个系统,其中部分任务可以由依赖于 C/Assembly 的低级模块和可以用非 C 语言编写的其他组件来完成,如最近的这篇论文所示(使用 2009 年):

https://www.usenix.org/legacy/event/usenix09/tech/full_papers/renzelmann/renzelmann_html/

见下图:

点击查看图片

于 2017-08-03T07:31:00.623 回答
0

我们遇到了类似的问题,我们需要通过我们的在线平台访问硬件并实时展示它,所以我们的解决方案是购买一个适配器,它为硬件端口提供 IP,这样我们就可以使用 node.js 与它交谈,也许你可以找到类似的解决方案

于 2017-08-03T07:34:27.297 回答
0

我支持你,伙计。您应该可以自由地用 JavaScript 编写该设备驱动程序。然后,您可以使用https://github.com/andrei-markeev/ts2c之类的工具将其转换为 C。

于 2021-08-26T20:25:45.793 回答