如何用Javascript编写设备驱动程序

How to write device drivers in Javascript?

本文关键字:设备驱动程序 Javascript 何用      更新时间:2023-09-26

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

此外,我不确定在哪里发布这篇文章,所以任何关于这方面的建议都是受欢迎的。我希望这是问题的准确位置。

编号。不是。我的意思是,你可以写一些把Javascript编译成C的东西,但那太疯狂了。有点像试图用勺子当链锯。

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

哦,天哪。在js中编写驱动程序?为什么?我的意思是,也许你可以为CC++中的某个东西编写一个javascript包装器,但你为什么要这样做?设备驱动程序与机器的通信级别相当低(硬件级别)。Javascript没有。Javascript是一种网络语言(好吧,大部分)。

正如Rich Bradshaw所说,这就像用勺子当电锯。虽然对我来说,这更像是把独木舟当作坦克。

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

你为什么对js感兴趣?事实上,你应该了解编程语言的内部结构,知道你试图实现什么,还需要知道你的程序将如何与操作系统交互,以与设备寄存器和中断等进行通信。

尽管听起来很傻,但现在正在为各种物联网设备进行这项工作。但在我见过的所有情况下,该设备本身都包括一个V8 JS引擎的修改版本。Mozilla手机公开了一个HW访问接口,但它并不是一个真正的设备驱动程序,而是一个暴露于JS的骨架API。

我敦促你学习Object Pascal或C/C++,因为它们是唯一适合这类工作的真正"真实"语言。传统上,C是最常用的语言,但C和Pascal本质上是同一种语言,语法不同。C++构建器和Object Pascal甚至共享相同的代码生成,顶部有不同的解析器/lexer。

话虽如此,一些自定义驱动程序可以在NodeJS中编码并没有真正的原因。在Linux下,许多硬件中间件最初是用Python编写的,后来才用C完成。因此,只要有人调整了访问硬件的运行时,一切都是可能的。FreePascal和Python使GPIO访问Raspberry PI 1-2成为可能。但毫无疑问,像C/C++和ObjectPascal这样的真实语言占据了上风。

"真实"的含义是编译为平台的机器代码,而虚幻的含义是指python和javascript等脚本引擎。

任何语言都可以用来编写设备驱动程序,前提是必须满足以下几个条件:

  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 interpreter。这并非不可能——最近的Linux内核中有一个运行在内核中的BPF intelpreter,所以您有一个在内核中运行的BPF VM:

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

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

Java作为设备驱动程序的想法以前已经实现过,作为一篇研究论文/项目(针对Sun Solaris操作系统):

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/

见下图:

点击查看图片

我们面临着类似的问题,我们需要通过我们的在线平台访问硬件并实时展示,所以我们的解决方案是购买一个适配器,该适配器将ip提供给硬件端口,以便我们能够使用node.js与之交谈。也许你可以找到类似的解决方案

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

您可能可以通过实现WebUSB API来完成类似的操作。它用于理解没有所需驱动程序的usb设备。可在Chrome 中完全实现