是否可以在Javascript中编写硬件驱动程序?这项任务需要的步骤是什么?
另外,我不确定在哪里发布此内容,因此欢迎任何有关此问题的建议。我希望这是问题的准确位置。
答案 0 :(得分:24)
没有。并不是的。我的意思是,你可以通过编写将Javascript编译成C的东西,但这会非常疯狂。有点像试图用勺子作为电锯。
学习C.这是工作的正确工具。
答案 1 :(得分:2)
哦,天啊。在js
中编写驱动程序?为什么?我的意思是,您可以为C
或C++
中的某些内容编写javascript包装器,但是为什么要这样做呢?设备驱动程序以相当低的级别(硬件级别)与机器通信。 Javascript没有。 Javascript是一种Web语言(主要是)。
Rich Bradshaw说,这就像用勺子作为电锯。虽然对我而言,更像是尝试用独木舟作为坦克。
答案 2 :(得分:2)
你为什么对js感兴趣?实际上,您应该了解编程语言的内部知识,以了解您要实现的目标,并且您还需要了解程序如何与您的OS进行交互以与设备寄存器进行通信以及中断等。
答案 3 :(得分:2)
听起来很傻,现在正在为各种物联网设备做这件事。但在我看到的所有情况下,设备本身都包含V8 JS引擎的修改版本。 Mozilla手机暴露了一个硬件访问界面,但它不是真正的“真正的”设备驱动程序,而是一个向JS公开的骨架API。
我建议您学习Object Pascal或C / C ++,因为它们是唯一真正适合此类工作的“真正”语言。传统上C是最常用的语言,但C和Pascal在语法上基本相同。 C ++ builder和Object Pascal甚至共享相同的codegen,顶部有不同的解析器/词法分析器。
话虽如此,没有真正的理由可以在NodeJS中编写一些自定义驱动程序。在Linux下,许多硬件中间件首先用Python编写,只能在C中完成。所以一切皆有可能,只要有人调整了运行时关于访问硬件的能力。 FreePascal和Python使得Raspberry PI 1-2上的GPIO访问变得轻而易举。但毫无疑问,真正的语言,如C / C ++和Object Pascal占了上风。
将“real”含义编译为平台的机器代码,并且虚幻引用python和javascript等脚本引擎。
答案 4 :(得分:0)
只要满足一些条件,任何语言都可用于编写设备驱动程序:
https://patchwork.kernel.org/patch/8163061/
作为设备驱动程序,您可能直接访问虚拟内存或物理内存(在DMA的情况下),因此需要绕过MMU的虚拟内存设置。直接访问虚拟内存意味着您知道虚拟地址,并希望直接读取地址。
Java或Javascript没有任何语言结构可直接通过已知地址读取内存。
汇编语言敏感任务:经常访问硬件需要特殊的汇编指令,例如禁用中断,或从一个CPU切换到另一个CPU,或者广播CPU间消息等。没有Java构造可以完成所有操作这些,也许甚至不是C语言。这就是为什么经常需要结合C +汇编的原因。但是没有办法将Java和汇编结合起来。
原生语言与解释语言:所有解释语言都必须通过解释器来执行语言。在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语言编写的组件来完成部分任务,如图所示最近的这篇论文(Usenix 2009):
https://www.usenix.org/legacy/event/usenix09/tech/full_papers/renzelmann/renzelmann_html/
见下图:
答案 5 :(得分:0)
我们遇到了类似的问题,我们需要通过我们的在线平台访问硬件并显示它,所以我们的解决方案是购买一个适配器,它将ip提供给硬件端口,这样我们就可以使用node.js与它说话了你可以找到类似的解决方案