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

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

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

8 ответов

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

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

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

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

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

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

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

Имеет "реальное" значение, скомпилированное с машинным кодом для платформы, и нереальное обращение к механизмам сценариев, таким как python и javascript.

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

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

Я поддерживаю тебя, чувак. Вы живете наилучшим образом и пишете драйвер устройства на JavaScript. Затем вы можете использовать такой инструмент, как https://github.com/andrei-markeev/ts2c, чтобы преобразовать его в C.

Будь как Остин и держи это странно, чувак!

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

Вероятно, вы могли бы сделать что-то подобное, внедрив WebUSB API . Он используется для понимания USB-устройств без необходимого драйвера. Полностью реализуемо в Chrome

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

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

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

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

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

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

  2. Родной язык против интерпретируемого языка: весь интерпретируемый язык должен пройти через интерпретатора для исполнения языка. В Javascript или Java вам нужна JVM для выполнения Java. Так что если вам нужна Java в ядре, то вам понадобится интерпретатор JVM в ядре. Это не невозможно - в недавнем ядре Linux в ядре работает BPF intepreter, поэтому в ядре работает виртуальная машина BPF:

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/

Смотрите схему ниже:

Нажмите, чтобы увидеть картинку

Другие вопросы по тегам