Как написать драйверы устройств в Javascript?

Можно ли написать драйверы аппаратного обеспечения в Javascript? Какими будут шаги, необходимые для выполнения такой задачи?

Кроме того, я не знал, где разместить это, поэтому любые предложения по этому поводу также приветствуются. Надеюсь, это точное место для вопроса.

+16
источник поделиться
6 ответов

Нет. На самом деле, нет. Я имею в виду, вы могли бы, написав что-то, что компилирует Javascript в C, но это было бы довольно сумасшедшим. Бит как попытка использовать ложку в качестве бензопилы.

Узнать C. Это правильный инструмент для работы.

+22
источник

О, черт возьми. Написание драйвера в js? Зачем? Я имею в виду, что вы могли бы написать javascript-оболочку для чего-то в C или C++, может быть, но зачем вам это делать? Драйверы устройств взаимодействуют с аппаратом на довольно низком уровне (аппаратный уровень). Javascript этого не делает. Javascript - это веб-язык (ну, в основном).

Как сказал Рич Брэдшоу, ему нравится использовать ложку в качестве бензопилы. Хотя для меня это было бы больше похоже на попытку использовать каноэ в качестве танка.

+2
источник

Ничего себе, эта идея не имеет смысла, ИМХО вы выбираете язык программирования для решения проблемы или задачи, а не наоборот. Я работаю с драйверами устройств и файлами, связанными с ОС, но только потому, что я могу программировать на C. Я не использую C для выполнения других задач, таких как администрирование Linux для моего встроенного устройства; вместо этого я использую что-то высокое, например, Bash, Perl или Python (в зависимости от моего настроения:)).

Почему вас интересует js? Фактически, вы должны понимать внутренности языка программирования, чтобы знать, чего вы пытаетесь достичь, а также вам нужно знать, как вы будете взаимодействовать с вашей ОС, чтобы обмениваться данными с регистрами устройств и прерываниями между прочим.

+2
источник

Как ни глупо, как это звучит, сейчас это делается для различных устройств IOT. Но во всех случаях, которые я видел, само устройство включает модифицированную версию двигателя V8 JS. Телефон Mozilla предоставляет интерфейс доступа HW, но опять же это не настоящий "драйвер" устройства, а API скелета, который подвергается JS.

Я бы попросил вас изучить Object Pascal или C/С++, поскольку они являются единственными истинными "настоящими" языками, подходящими для этого типа работы. Традиционно C является наиболее часто используемым языком, но C и Pascal по сути являются одним и тем же с другим синтаксисом. С++ builder и Object Pascal даже используют один и тот же код, с другим синтаксическим анализатором/лексером.

Сказав это, нет никакой реальной причины, по которой некоторые пользовательские драйверы могут быть закодированы в NodeJS. В Linux большое количество промежуточного программного обеспечения HW сначала написано на Python, только для того, чтобы быть завершенным на C. Таким образом, все возможно, если кто-то адаптировал среду выполнения для доступа к оборудованию. FreePascal и Python обеспечивают доступ GPIO к малине PI 1-2. Но не может быть никаких сомнений в том, что лучшие языки, такие как C/С++ и Object Pascal, имеют верх.

С "реальным" значением, скомпилированным для машинного кода для платформы, и нереальным ссылкой на script, такие как python и javascript.

+2
источник

Для записи драйвера устройства может использоваться любой язык, если необходимо выполнить несколько условий:

  • Прямой доступ к памяти. Посмотрите на этот исходный код:

https://patchwork.kernel.org/patch/8163061/

В качестве драйвера устройства вы можете напрямую обращаться к виртуальной памяти или физической памяти (в случае DMA) и, таким образом, обходить настройку виртуальной памяти с помощью MMU. Прямой доступ к виртуальной памяти означает, что вы знаете виртуальный адрес и хотите напрямую прочитать адрес.

Java или Javascript не имеют какой-либо языковой конструкции для чтения памяти через известный адрес напрямую.

  1. Задачи на языке, чувствительные к языку: доступ к аппаратным средствам очень часто требует специальной инструкции по сборке, например, отключение прерывания или переключение с одного процессора на другой или передача сообщений между процессорами и т.д. Java-конструктор не делает все это, возможно, даже не C-язык. Итак, почему часто требуется объединение сборки C+. Но нет возможности объединить Java и сборку.

  2. Исходный или интерпретируемый язык: для каждого языка должен быть переписан интуитивный язык. В Javascript или Java вам нужна JVM для выполнения Java. Поэтому, если вам нужна Java в ядре, вам понадобится JVM intepreter в ядре. Это не невозможно. В последнем ядре 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/

См. диаграмму ниже:

Нажмите, чтобы посмотреть изображение

0
источник

Мы столкнулись с аналогичной проблемой, нам нужно было получить доступ к оборудованию через нашу онлайн-платформу и показать ее в прямом эфире, поэтому наше решение заключалось в покупке адаптера, который передает ip в аппаратный порт, чтобы мы могли поговорить с ним, используя node. js, возможно, вы можете найти аналогичное решение

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос