如何在Javascript中编写设备驱动程序?

时间:2012-08-22 17:10:09

标签: javascript driver linux-device-driver ecmascript-5

是否可以在Javascript中编写硬件驱动程序?这项任务需要的步骤是什么?

另外,我不确定在哪里发布此内容,因此欢迎任何有关此问题的建议。我希望这是问题的准确位置。

6 个答案:

答案 0 :(得分:24)

没有。并不是的。我的意思是,你可以通过编写将Javascript编译成C的东西,但这会非常疯狂。有点像试图用勺子作为电锯。

学习C.这是工作的正确工具。

答案 1 :(得分:2)

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

Rich Bradshaw说,这就像用勺子作为电锯。虽然对我而言,更像是尝试用独木舟作为坦克。

答案 2 :(得分:2)

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

你为什么对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)

只要满足一些条件,任何语言都可用于编写设备驱动程序:

  1. 直接内存访问。看看这个源代码:
  2. 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:

    3. 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/

      见下图:

      Click to see picture

答案 5 :(得分:0)

我们遇到了类似的问题,我们需要通过我们的在线平台访问硬件并显示它,所以我们的解决方案是购买一个适配器,它将ip提供给硬件端口,这样我们就可以使用node.js与它说话了你可以找到类似的解决方案