如何用Javascript编写设备驱动程序
How to write device drivers in Javascript?
是否可以用Javascript编写硬件驱动程序?这项任务需要采取哪些步骤?
此外,我不确定在哪里发布这篇文章,所以任何关于这方面的建议都是受欢迎的。我希望这是问题的准确位置。
编号。不是。我的意思是,你可以写一些把Javascript编译成C的东西,但那太疯狂了。有点像试图用勺子当链锯。
学习C.这是适合这份工作的工具。
哦,天哪。在js
中编写驱动程序?为什么?我的意思是,也许你可以为C
或C++
中的某个东西编写一个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等脚本引擎。
任何语言都可以用来编写设备驱动程序,前提是必须满足以下几个条件:
- 直接内存访问。查看以下源代码:
https://patchwork.kernel.org/patch/8163061/
作为设备驱动程序,您可能直接访问虚拟内存或物理内存(在DMA的情况下),因此需要绕过MMU设置的虚拟内存。直接访问虚拟内存意味着您知道虚拟地址,并希望直接读取地址。
Java或Javascript没有任何语言结构可以直接通过已知地址读取内存。
-
汇编语言敏感任务:访问硬件通常需要特殊的汇编指令,如禁用中断、从一个CPU切换到另一个CPU、广播CPU间消息等。没有Java结构可以完成所有这些,甚至可能没有C语言。所以这就是为什么经常需要组合C++程序集的原因。但是没有办法将Java和汇编结合起来。
-
原生语言与解释语言:所有未经翻译的语言都必须通过未经翻译程序才能执行该语言。在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 中完全实现
- Javascript:selenium Web驱动程序isDisplayed()不工作
- Selenium Web驱动程序和javascript
- PhantomJS重影驱动程序停止
- Selenium驱动程序不反映单击()后的页面更改
- Xpath对Selenium Web驱动程序无效”;Xpath未找到”;
- 等待,直到使用Java在selenium网络驱动程序中手动单击登录按钮
- Sencha禁用按钮和Selenium Web驱动程序
- 通过web驱动程序异步执行Javascript
- 如何使用Python/Selenium网络驱动程序处理Angularjs/Javascript下拉列表
- 如何使用Selenium Web驱动程序验证电子邮件
- 如何在另一个 html 标签内选择 web 元素硒 Web 驱动程序与 html 源
- 网络驱动程序中使用的向下滚动功能从网页的哪个部分进行搜索
- Minitest/Capibara:切换到JS驱动程序时,绿色测试变为红色
- 如何用Javascript编写设备驱动程序
- 未从Selenium网络驱动程序中的配置文件接收到正确的值
- Mongodb节点驱动程序2.0.*与Bluebird 2.9.*承诺
- Node.js Mongodb原生驱动程序连接共享
- RxJS:在循环中处理错误.js自定义驱动程序
- Web 驱动程序管理器更新错误:EACCES,权限被拒绝
- 如何在启动 Web 驱动程序实例之前通过命令行在 conf.js 中传递设备名称