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

20

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

另外,我不确定在哪里发布这个问题,所以对于这个问题的任何建议也欢迎。我希望这是正确的位置。


2
JS最初是作为Web浏览器的一部分实现的,以便客户端脚本可以与用户交互并控制浏览器行为。 - AminM
27
你应该查看 O'Reilly 出版的这本书的标题(链接已提供)。 - Antti Haapala -- Слава Україні
这应该是被接受的答案@AnttiHaapala。 - olsn
8个回答

29

不,实际上不行。我是说,你可以编写一个将JavaScript编译成C的工具,但那样做太疯狂了,就像试图用勺子作为电锯一样。

学习C语言吧,那才是这项工作的正确工具。


各种平台上存在许多用户模式驱动程序框架,这些框架怎么样? :-) - Jason Malinowski
@JasonMalinowski 目前来看,最简单的方法就是这样做。 - Phillip Schmidt
2
我现在很想写一个基于FUSE的文件系统驱动程序,只是因为我能做到!Atwood's Law FTW! - Jason Malinowski
据我所知,你仍然不会使用Javascript和UMDF。个人而言,我喜欢JS,但在这种情况下,最好找到合适的工具,而不是尝试使用其他工具替代它。 - Rich Bradshaw

5

哦,天啊。用 js 写驱动程序?为什么呢?我的意思是,你可以写一个用 CC++ 包装的javascript,但你为什么要这样做呢?设备驱动程序在相当低的级别(硬件级别)与机器通信。而Javascript不是。Javascript是一种网络语言(嗯,大多数情况下是这样)。

正如Rich Bradshaw所说,这就像使用勺子作为链锯一样。但对我来说,更像是试图将独木舟用作坦克。


但是我们可以编写一个程序,将JavaScript转换为驱动程序代码,对吧? - Bakshi

3
尽管听起来有些傻,但现在各种物联网设备都在这样做。但在我看到的所有情况中,设备本身都包含了修改后的V8 JS引擎。Mozilla手机公开了硬件访问接口,但它实际上不是一个“真正”的设备驱动程序,而只是向JS公开的框架API。
我建议您学习Object Pascal或C/C++,因为它们是唯一适合这种工作的真正“真实”语言。传统上,C是最常用的语言,但C和Pascal本质上是相同的东西,只是语法不同。C++构建器和Object Pascal甚至共享相同的代码生成器,只是在其上有不同的解析器/词法分析器。
话虽如此,在NodeJS中编写一些自定义驱动程序也没有真正的理由。在Linux下,很多硬件中间件首先是用Python编写的,然后才最终转换成C。因此,只要有人已经适应了访问硬件的运行时,就可以做到一切皆有可能。FreePascal和Python使树莓派1-2的GPIO访问变得非常简单。但毫无疑问,真正的语言,如C/C++和Object Pascal具有优势。
“真正”是指编译为平台的机器代码,“虚幻”是指像Python和JavaScript这样的脚本引擎。

3
我想知道“Linux系统中的程序通常是先用Python编写,再用C完成”的说法从何而来。我自己也从事过内核开发,认识很多以此为职业的人。如果有人提出这种想法,他们可能都会笑翻了。 - Igor Stoppa
同样适用于Pascal和C++。 - Igor Stoppa
“而我应该在哪里写那个‘内核东西’,正如你所说的,伊戈尔,是用Python写的吗?也许当你完成像个孩子一样的行为后,你可以阅读文本而不是胡编乱造?如果你要针对树莓派上的GPIO引脚进行操作,以控制更复杂的硬件,使用Python来进行实验并正确地进行IO操作会更快。一旦完成了这部分工作,如果你需要比Python更高的速度(取决于负载和设备),你可以使用Free Pascal或C来编写最终的代码。 如果你的回答就像你上面写的那样幼稚,那么很显然你对FPC的代码质量知之甚少。” - Jon Lennart Aasenden
嗯,你知道攻击想法是可以的,但不应该将其扩展到人身上,对吧? 现在你知道了。我希望你能记住这一点,并请尽量不要过于情绪化。这并不会让你看起来特别好。你似乎混淆了通过现有内核API“使用”GPIO和编写真正的设备驱动程序。 是的,你可以玩一些简单的API,但最终你将受到不必要的上下文切换的影响,必须处理抢占和许多其他问题,这些问题来自这个聪明的想法。 - Igor Stoppa
Igor,流行度不是质量的衡量标准,而是灵活性和可用性的衡量标准。至于个人层面的侮辱,请再次阅读您的最初回复,看看那里的源头在哪里。我的观点是:解决问题有很多种方式,在某些情况下,可能使用您不熟悉的工具来解决问题。这对我、你和每个人都适用。当Python明显是更好的选择时,我没有使用Python作为解决方案的问题,同样也没有对NodeJS提出异议。我反对的是对其他编程语言缺乏开放性的态度。 - Jon Lennart Aasenden
显示剩余2条评论

3

哇,这个想法有点不靠谱,在我看来,你应该选择一种编程语言来解决问题或任务,而不是相反。我从事设备驱动程序和操作系统内核相关的工作,但仅仅因为我能用C语言编程,我并不会使用C语言来完成其他任务,比如我的嵌入式设备的Linux管理; 相反,我会使用一些高级语言,比如Bash、Perl或Python(取决于我的心情 :))。

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


0

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


0

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


0

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

  1. 直接内存访问。请查看以下源代码:

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操作系统的研究论文/项目。

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

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

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

然而,总是有可能设计一个系统,其中部分任务可以由低层模块完成,该模块依赖于C/汇编语言,其他组件可以用非C语言编写,如最近一篇论文所示(Usenix 2009年):

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

请看下面的图表:

点击查看图片


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接