Можно ли написать драйвер устройства на Java?

Введение

Я слышал что-то о написании драйверов устройств на Java (слышал, как «своими ушами», а не из Интернета), и мне было интересно ... Я всегда думал, что драйверы устройств работают на уровне операционной системы и, следовательно, должны быть написаны на том же языке как ОС (то есть в основном C, я полагаю)

Вопросы

  1. Я вообще ошибаюсь в этом предположении? (так кажется)
  2. Как можно использовать в ОС драйвер на "чужом" языке?
  3. В любом случае, каковы требования (с точки зрения языка программирования) к драйверу устройства?

Спасибо за чтение


person Philip Stark    schedule 25.03.2009    source источник
comment
О каком типе драйверов устройств идет речь?   -  person bdd    schedule 26.03.2009
comment
Понятия не имею, правда просто где-то подобрал и интересно :)   -  person Philip Stark    schedule 26.03.2009
comment
Удачи в работе с беззнаковыми целыми числами ...   -  person Tamas Czinege    schedule 26.03.2009
comment
@DrJokepu: Удачи в работе с процессором ввода-вывода, таблицами страниц, MSR, управлением кешем и т. Д. Из C (у него нет такой поддержки) ...   -  person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x    schedule 01.07.2010
comment
Я просто хочу сказать, что это сообщество просто потрясающее! Так много проницательных знаний стало доступно таким простым способом. Должен сказать, это довольно волшебно.   -  person Philip Stark    schedule 20.10.2010


Ответы (13)


Это можно сделать двумя способами.

Во-первых, код, работающий на «уровне ОС», не обязательно должен быть написан на том же языке, что и ОС. Он просто должен быть связан с кодом ОС. Практически все языки могут взаимодействовать с C, а это действительно все, что нужно.

Так что с точки зрения языка проблем технически нет. Функции Java могут вызывать функции C, а функции C могут вызывать функции Java. И если ОС написана не на C (скажем, ради аргумента, что она написана на C ++), то код ОС C ++ может вызывать некоторый промежуточный код C, который пересылается на вашу Java, и наоборот. C - это в значительной степени lingua franca программирования.

После того, как программа была скомпилирована (в машинный код), ее исходный язык больше не актуален. Ассемблер выглядит одинаково независимо от того, на каком языке исходный код был написан до компиляции. Пока вы используете то же соглашение о вызовах, что и ОС, это не проблема.

Более серьезная проблема - это поддержка во время выполнения. В ОС доступно не так много программных сервисов. Например, обычно нет виртуальной машины Java. (Нет причин, по которым технически не могло быть, но обычно, но обычно можно с уверенностью предположить, что его нет).

К сожалению, в своем "стандартном" представлении в виде байт-кода Java программа Java требует большой инфраструктуры. Ему нужна виртуальная машина Java для интерпретации и JIT байт-кода, а также библиотека классов и так далее.

Но есть два способа обойти это:

  • Поддержка Java в ядре. Это был бы необычный шаг, но его можно было бы сделать.
  • Или скомпилируйте исходный код Java в собственный формат. Программу Java не нужно компилировать в байт-код Java. Вы можете скомпилировать его на ассемблер x86. То же самое касается любых библиотек классов, которые вы используете. Их тоже можно было скомпилировать до ассемблера. Конечно, для частей библиотеки классов Java требуются определенные функции ОС, которые будут недоступны, но тогда использования этих классов можно было бы избежать.

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

Конечно, еще одна проблема может заключаться в том, что Java не позволит вам получить доступ к произвольным участкам памяти, что сделало бы большую часть аппаратной связи довольно сложной. Но это тоже можно обойти, возможно, вызвав очень простые функции C, которые просто возвращают соответствующие области памяти в виде массивов для работы Java.

person jalf    schedule 26.03.2009
comment
+1: Очень проницательно, но вы забыли упомянуть, что, хотя это возможно, в большинстве случаев все же довольно безумно. - person Adam Hawes; 26.03.2009
comment
В мире компьютеров, если вы можете себе это представить, это возможно! - person Chii; 26.03.2009
comment
Если бы кто-то другой приложил усилия для переноса JVM в ядро ​​и оптимизировал его для обеспечения достойной производительности, это имело бы большой смысл. Я не думаю, что вы полностью осведомлены о том, что такое средний программист драйверов. - person Blaisorblade; 25.01.2011
comment
Что касается H / W-коммуникации, даже в Linux вы используете для этого библиотечные функции - не на всех платформах вы можете писать в области памяти, и когда вы это делаете, это скрыто от вас. Что касается компиляции в собственный код, вам нужен как минимум сборщик мусора в ядре, как я писал в другом месте, и это сложно. В противном случае вы потеряете большинство преимуществ Java. - person Blaisorblade; 25.01.2011
comment
@Blaisorblade: что ты хочешь сказать? Похоже, вы говорите в значительной степени именно то, что я уже написал в своем посте. - person jalf; 25.01.2011
comment
Компиляция Java на ассемблер невозможна, поскольку это не устраняет необходимость в сборке мусора. Это служба времени выполнения, которой нельзя избежать, о которой вы не упоминаете. Следовательно, поддержка Java вообще - это огромная работа, и она невозможна для программиста драйверов. Вы, кажется, предполагаете, что это возможно. Затем, для H / W-коммуникации, вы предлагаете писать в массивы, а не в память. Поскольку вы не можете писать в память, чтобы общаться с устройствами на многих архитектурах, вам понадобится другой API, который предоставляет устройства для ввода-вывода. - person Blaisorblade; 16.02.2011
comment
@Blaisorblade: языки, которые компилируются в сборку, также полагаются на различные службы времени выполнения. Как вы думаете, для чего, например, предназначена среда выполнения C? Точно так же нет теоретической причины, по которой сборщик мусора не может быть предоставлен для программы Java, скомпилированной для сборки. Как я уже сказал, это будет много работы, но без всякой выгоды, но это возможно. И почти каждый современный ЦП (о котором я знаю) полагается на отображение памяти для аппаратного ввода-вывода. В любом случае, вы, кажется, упустили из виду, что весь смысл моего ответа состоит в том, что это теоретически возможно, но на самом деле это было бы болезненно. - person jalf; 16.02.2011
comment
Что касается GC, он может быть включен в сам код драйвера. Он не должен предоставляться вам операционной системой или какой-либо предопределенной средой выполнения. И если вам нужно использовать отдельный API для ввода-вывода, вы просто предоставляете эти функции C своему Java-приложению. Взаимодействие с C / Java не новость. Опять же, теоретически возможно написать драйвер на Java. Это будет просто тонна работы, трудно увидеть одно преимущество. Но это возможно. Это то, что спросил ОП. - person jalf; 16.02.2011
comment
С одной стороны, я не понял вашей точки зрения, потому что она не была полностью ясна в вашем ответе (как отмечено в комментарии Адама Хоуза). С другой стороны, я отвечал на комментарий Чии. Я убежден, что было бы разумно, если бы кто-нибудь поддерживал написание драйверов на более удобном языке. Возможно, вы упустили мою мысль: дело не в том, что вы не можете поддерживать Java, просто некоторые стратегии, предложенные в вашем ответе, не работают. Вы писали, что можно скомпилировать Java на ассемблер и избежать использования служб времени выполнения, которые недоступны, но избежать сборки мусора невозможно. Доступ к памяти проще, чем вы написали. - person Blaisorblade; 21.02.2011
comment
@Blaisorblade: вы все равно ошибаетесь, по крайней мере, в двух отношениях: GC можно избежать. Приложение просто должно действовать как если существует сборщик мусора. При достаточном статическом анализе компилятор мог генерировать код для управления памятью, не полагаясь на настоящий универсальный сборщик мусора. И, что более реалистично, код GC может быть встроен в сам код драйвера. Службы времени выполнения, на которые опирается программа Java, не обязательно должны предоставляться отдельно. Все они могут быть встроены в программу (в данном случае в драйвер) - person jalf; 21.02.2011
comment
Точные алгоритмы статического анализа неразрешимы, поэтому статический анализ дает приблизительные ответы. В некоторых случаях исследователи сделали результаты достаточно точными, чтобы их можно было использовать, и опубликовали об этом статью. Можете ли вы указать на бумагу, подтверждающую вашу догадку? В противном случае я могу указать на bit.ly/i55fVU, где показано, что было сделано - в основном, если вы запрограммируете согласно определенным правилам, вы можете обойтись без сборщика мусора и с небольшими явными аннотациями в исходном коде. - person Blaisorblade; 25.02.2011
comment
Написание сборщика мусора как части драйвера в принципе возможно; Я считаю, что делать это для одного водителя просто невыгодно. Более того, вам, вероятно, потребуется тонко изменить ядро ​​ядра, чтобы написать сборщик мусора. Как вы обрабатываете косвенные ссылки из кучи C в кучу Java? Если вам нужно изменить ядро ​​ядра, вы пишете не обычный драйвер. - person Blaisorblade; 25.02.2011
comment
@Blaisorblade: Рентабельно? Я никогда не утверждал, что это так. В любом случае, сборщик мусора не должен иметь возможность перемещать объекты или выполнять уплотнение кучи. Просто используйте более простой сборщик мусора, который не перемещает объекты после того, как они были выделены. Нет причин, по которым вам нужно было бы модифицировать ядро ​​для этого. Но опять же, я никогда не утверждал, что это рентабельно, хорошая идея или даже разумное поведение человека. Вы должны быть сумасшедшим, чтобы даже попробовать это. Я просто говорю, что это технически возможно. - person jalf; 25.02.2011
comment
Однако позвольте мне еще раз спросить, есть ли у вас замечание по этому поводу? То, что я говорю, тривиально верно: вы могли встроить необходимые службы времени выполнения в драйвер, а затем могли написать свой драйвер на Java. Вы можете заменить сборщик мусора простым механизмом подсчета ссылок (и добавить механизм прерывания циклов). Что именно вы пытаетесь доказать? Против чего именно вы возражаете? Если у вас нет чего-то нового для обсуждения, думаю, мы на этом закончили. - person jalf; 26.02.2011
comment
Всякий раз, когда можно избежать небезопасных языков, таких как C, это полезно, как объясняет теория языков программирования. Это в корне отличается от вашей точки зрения. Конечно, я предполагаю, что автор ОС будет поддерживать безопасный язык, а плохой автор драйвера просто напишет свой драйвер. В остальном ваш вывод верный. Вот почему я обсуждал, как сделать это хорошо и с минимальными затратами (но Singularity, возможно, лучше). А пока я рад вашему окончательному решению проблемы с GC. Как правило, ничего из того, что я написал, не имелось в виду лично для вас, поэтому не нужно быть эмоциональным. - person Blaisorblade; 24.03.2011

Написание драйверов устройств Solaris на Java касается устройства RAM-диска, написанного на Java. .

Еще один для Linux. Более подробно рассматривается, почему вам также может понадобиться DD на Java (поскольку некоторые люди интересовались внешним видом других сообщений и комментариев)

person TofuBeer    schedule 26.03.2009

Драйвером устройства может быть много чего

На самом деле я пишу драйверы устройств на java, чтобы заработать себе на жизнь: драйверы для промышленных устройств, таких как весы или устройства для взвешивания, упаковочные машины, сканеры штрих-кода, мосты для взвешивания, принтеры для сумок и коробок, ... Java - действительно хороший выбор.

Некоторые примеры

Промышленные устройства сильно отличаются от ваших домашних / офисных устройств (например, сканеров, принтеров). В частности, в сфере производства (например, продуктов питания) компании все чаще выбирают централизованный сервер, на котором выполняется приложение MES (например, разработанное на Java). Сервер MES должен взаимодействовать с устройствами производственной линии, но также содержит бизнес-логику . Java - это язык, который может делать и то, и другое.

Там, где ваши домашние / офисные устройства часто встроены в ваш компьютер или подключены с помощью USB-кабеля, эти промышленные устройства обычно используют разъемы Ethernet или RS232. Так что, по сути, практически любой язык может сделать работа.

В этой области пока нет большой стандартизации. Большинство поставщиков предпочитают создавать свои собственные протоколы для своих устройств. В конце концов, они строители оборудования, а не гении программного обеспечения. В результате существует большое разнообразие протоколов. Некоторые поставщики предпочитают простые текстовые протоколы, но другие предпочитают сложные двоичные протоколы с кодами CRC, кадрированием, ... Иногда им нравится складывать несколько протоколов (например, алгоритм подтверждения связи конкретного поставщика поверх уровня OPC). У сильного ООП-языка есть много преимуществ.

Например. Я видел печать Java с постоянной скоростью 100 мс / цикл. Это включает создание уникальной этикетки, отправку ее на принтер, получение подтверждения, печать на бумаге и нанесение на продукт с помощью давления воздуха.

Итак, возможности Java:

  • Это полезно как для бизнес-логики, так и для сложных интерфейсов.
  • Он так же надежен в связи с сокетами, как и C.
  • Некоторые драйверы могут использовать преимущества ООП Java.
  • Java достаточно быстрая.
person bvdb    schedule 01.04.2015

Это не невозможно, но, возможно, сложно и, возможно, не имеет особого смысла.

Возможно, потому что Java - это нормальный язык программирования, и пока у вас есть способ доступа к данным, это не проблема. Обычно в современной ОС ядро ​​имеет уровень, позволяющий каким-либо образом разрешить прямой доступ к оборудованию. Также уже существуют драйверы в пользовательском пространстве, по крайней мере, пользовательскую часть не должно быть проблем для реализации на Java.

Возможно, в этом нет особого смысла, потому что ядро ​​должно запустить JVM для выполнения драйвера. Также реализации JVM обычно потребляют много памяти.

Вы также можете использовать Java-код, скомпилированный для выполнения на платформе (не с помощью JVM). Обычно это не так эффективно, но может подойти для драйвера устройства.

Вопрос в том, есть ли смысл реализовать драйвер на Java? Или по-другому: на какую выгоду вы надеетесь, если вы используете Java для реализации драйвера вместо другой альтернативы? Если вы можете ответить на этот вопрос, вы должны найти способ сделать это возможным.

В конце подсказка к JNode, проекту, который пытается реализовать полную ОС, основанную исключительно на Java.

person Mnementh    schedule 25.03.2009
comment
Я считаю, что неустановленное предположение здесь [см. Пункт 2 в вопросе] заключается в том, что мы говорим о вашей типичной машине (например, x86), возможно, с вашей типовой ОС (например, Linux или Windows), НЕ на picojava, НЕ в ОС Java , НЕ в ядре с поддержкой JVM и т. Д. - person vladr; 26.03.2009
comment
Да, возможно. Но вы можете скомпилировать Java в собственный код. Я не говорю, что с Java легко. Вот почему я спросил, какова ожидаемая польза. - person Mnementh; 27.03.2009
comment
Когда вы набираете определенное количество операций в секунду (скажем, 500 000 операций в секунду), прерывания и переключение контекста между ядром и пользователем становятся наиболее значительными препятствиями на пути к производительности. Чистым драйверам пользовательского пространства не требуется переключение контекста, так что это уходит. Прерывания видны только драйверам на стороне ядра, поэтому необходим механизм ретрансляции, такой как UIO, если вы хотите, чтобы они приходили в пользовательское пространство. Драйверам не всегда нужны прерывания - могут помочь барьеры опроса и памяти. - person Ross Judson; 14.11.2013

У вас слишком узкое представление о драйверах устройств.

Я написал такие драйверы устройств поверх MOST в автомобильном приложении. Более широкое использование могут быть драйверы для USB-устройств, если Java когда-либо получит достойную USB-библиотеку.

В этих случаях существует общий протокол низкого уровня, который обрабатывается в собственном коде, а драйвер Java обрабатывает особенности устройства (форматы данных, конечные автоматы и т. Д.).

person starblue    schedule 26.03.2009

Возможно, вы слышали ссылку на JDDK?

Написание драйвера устройства на 100% на Java невозможно без собственного кода, чтобы обеспечить взаимодействие между (1) точками входа и соглашениями для драйвера, зависящими от ОС, и (2) экземпляром JVM. Экземпляр JVM может быть запущен «в процессе» (и «в процессе» может иметь разные значения в зависимости от ОС и от того, является ли драйвер драйвером режима ядра или пользовательского режима) или как отдельная пользовательская область. процесс, с которым может взаимодействовать тонкий, собственный уровень адаптации драйвера и на который упомянутый уровень адаптации драйвера может разгрузить фактическую работу пользователя.

person vladr    schedule 25.03.2009
comment
Вы настолько уверены в том, что «невозможно», что выделяете его жирным шрифтом? Вы можете скомпилировать java-код в собственный двоичный код, у вас может быть Java-процессор в качестве оборудования (мобильный телефон) или ваше ядро ​​содержит JVM. Все это способы разрешить использование чистых драйверов устройств Java. - person Mnementh; 26.03.2009
comment
нет java cpu и поэтому невозможно перейти к оборудованию. вам нужен машинный код для доступа к битам и байтам. - person Peter Parker; 26.03.2009
comment
@mnemeth, очень уверен; компиляция java в собственный (не java) код ни к чему не приведет без оберток собственного кода; в случае picojava обратите внимание, что я выделил жирным шрифтом больше, чем просто невозможно: мое утверждение все еще логически остается (собственный код - это байт-код java - тогда это возможно.) - person vladr; 26.03.2009
comment
@mnemeth, также обратите внимание, что ваш телефон, скорее всего, не запускает байт-код Java изначально или, по крайней мере, не на ЦП :) (в лучших случаях они будут использовать сопроцессор, чтобы помочь с некоторыми из байт-кода - см. jazelle) - person vladr; 26.03.2009
comment
Вы правы, нужен нативный код. Но для выполнения кода всегда нужен собственный код (даже неродной). Итак, я могу сказать: невозможно написать драйвер устройства на C без собственного кода. Это правда то же самое. (и я не отрицал вас, я только спросил) - person Mnementh; 27.03.2009
comment
Вы правы, я должен был квалифицировать это: без кастомного нативного кода (т. Е. Средств, которые еще не предусмотрены в JVM или в какой-либо библиотеке абстракции - что-то, что на сегодняшний день пришлось бы писать с нуля .) - person vladr; 27.03.2009
comment
Извините, что проголосовал против, но это категорически неверно, по крайней мере, для PCIe. Сегодня существуют чистые драйверы пространства пользователя Java для оборудования Infiniband (Google JVerbs). Ключевой метод здесь - отображение областей памяти устройства в адресное пространство jvm (/ dev / mem или UIO); оттуда ими можно напрямую манипулировать как ByteBuffers. UIO также предоставляет абстракцию для приема прерываний. - person Ross Judson; 13.11.2013
comment
@RossJudson, так как же сопоставить память с адресным пространством JVM, используя чистую Java? Вашему так называемому Java-драйверу ВСЕГДА потребуется встроенная поддержка, будь то JNI или какой-либо другой механизм, который предоставляет доступ к устройству на уровне файловой системы - вы называете это. - person vladr; 22.01.2014
comment
@vladr Если драйвер делает свои управляющие регистры и данные доступными на уровне файловой системы (как вы указываете), то отображение памяти в этом файле позволяет записать драйвер устройства в неизмененной JVM без JNI. Сложность заключается в отсутствии прямого доступа к прерываниям. UIO сопоставляет стандартные устройства PCIe с файловой системой, а также предоставляет конечную точку для получения прерываний. Вы правы - файловая система - это средство отображения памяти, но для этого не требуется JNI или модифицированная JVM. - person Ross Judson; 12.02.2014
comment
@vladr Я использовал эту технику, например, для рисования непосредственно в буфере кадра Linux. Можно отобразить файл буфера кадра (со значительными трудностями, потому что библиотеки Java пытаются изменить длину файла, и это необходимо обойти). - person Ross Judson; 12.02.2014
comment
@vladr Я должен четко уточнить, что я утверждаю, что можно управлять устройствами из пользовательского пространства Java. Я не утверждаю, что можно создать драйвер устройства в пользовательском пространстве Java, доступный для других программ через стандартные механизмы ... - person Ross Judson; 12.02.2014
comment
Некоторое оборудование просто обменивается данными с помощью сокетов; зачем в таком случае нужен собственный код? - Вывод: это действительно зависит от того, с каким оборудованием вы имеете дело. - person bvdb; 06.01.2016

Возможно скомпилировать Java-код в аппаратные инструкции (т. Е. Не байт-код JVM). См., Например, GCJ. Имея это в руках, вы намного ближе к возможности компилировать драйверы устройств, чем раньше.

Но я не знаю, насколько это практично.

person dmckee --- ex-moderator kitten    schedule 25.03.2009

Возможно?

Да, но только в особых случаях. Потому что вы можете написать операционную систему на Java и C #, а затем уметь писать для нее драйверы устройств. Ущерб памяти для этих драйверов и операционных систем был бы значительным.

Вероятно?

Скорее всего, не. По крайней мере, не в мире Windows, MacOS или даже Linux ... По крайней мере, в ближайшее время. Потому что такие языки, как C # и Java, зависят от CLR и JVM. Работа этих языков означает, что они не могут быть эффективно загружены в ring0.

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

person bdd    schedule 25.03.2009

Для мотивации, пожалуйста, помните, что существует множество быстрых языков, которые лучше, чем C для программирования; они могут быть не такими быстрыми, как C, но это безопасные языки: если вы сделаете ошибку, вы не получите неопределенного поведения. А «неопределенное поведение» включает выполнение произвольного кода, предоставленного каким-либо злоумышленником, который форматирует ваш HD. Многие функциональные языки обычно компилируются в собственный код.

Драйверы устройств содержат наибольшее количество ошибок в ядре ОС - я знаю это для Linux (Линус Торвальдс и другие постоянно так говорят), и я слышал это для Windows. В то время как для диска или драйвера Ethernet вам нужна первоклассная производительность, и хотя современные драйверы Linux являются узким местом для 10G Ethernet или SSD-дисков, большинству драйверов не нужна такая высокая скорость - все компьютеры ждут с той же скоростью.

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

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

  • Сборка мусора, а это жесткое требование. Вам необходимо написать сборщик мусора внутри ядра; некоторые алгоритмы GC полагаются на виртуальную память, и вы не можете их использовать. Более того, вам, вероятно, потребуется просканировать всю память ОС, чтобы найти корни для GC. Наконец, я бы доверял только алгоритму, гарантирующему (мягкий) сборщик мусора в реальном времени, что еще больше увеличило бы накладные расходы. Читая статью о драйверах устройств Java поверх Linux, они просто сдаются и требуют, чтобы программисты вручную освободили память. Они пытаются утверждать, что это не поставит под угрозу безопасность, но я не думаю, что их аргумент убедителен - даже не ясно, понимают ли они, что сборка мусора необходима для безопасного языка.

  • Отражение и загрузка класса. Полная реализация Java, даже при запуске собственного кода, должна иметь возможность загружать новый код. Этой библиотеки можно избежать, но если у вас есть интерпретатор или JIT-компилятор в ядре (и нет реальной причины, делающей это технически невозможным).

  • Представление. Статья о JVM в Linux очень плохая, и их показатели производительности неубедительны - действительно, они тестируют сетевой драйвер USB 1.1, а затем показывают, что производительность не так уж плоха! Тем не менее, если приложить достаточно усилий, можно наверняка сделать что-то лучшее.

Две последние вещи:

  • Я хотел бы упомянуть Singularity, полную ОС, написанную в варианте C #, только с уровнем аппаратной абстракции на родном языке.
  • Что касается picoJava, использовать его - плохая идея, если только ваша система не имеет действительно ограниченного объема памяти, например смарт-карту. Cliff Click уже объяснил, почему: это дает лучшую производительность для написания хорошей JIT, и в настоящее время даже смартфоны могут это поддерживать.
person Blaisorblade    schedule 24.01.2011

Драйверы устройств должны быть написаны на языке, который может выполняться в ядре, либо скомпилирован в него, либо загружен как модуль во время выполнения. Обычно это препятствует написанию драйверов устройств на Java, но я полагаю, что теоретически вы могли бы реализовать JVM внутри драйвера устройства и позволить ему выполнять код Java. Не то чтобы здравомыслящий человек захотел это сделать.

В Linux существует несколько реализаций файловых систем на уровне пользователя (то есть не на уровне ядра), которые используют общий уровень абстракции, называемый (fuse), который позволяет программам на уровне пользователя реализовывать вещи, которые обычно выполняются в ядре.

person JesperE    schedule 25.03.2009
comment
Некоторое оборудование просто обменивается данными с помощью сокетов, поэтому это действительно зависит от того, с каким оборудованием вы имеете дело. - person bvdb; 06.01.2016

Windows Driver Foundation (WDF) - это API Microsoft, который позволяет как User и Kernel. Это делается сегодня, и теперь он совместим с w2k и более поздними версиями (раньше w2k не поддерживался). Нет причин, по которым вызовы JNI не могут выполняться для работы в JRE. . . (при условии, что JNI по-прежнему является способом вызова Java из C / C ++ ... мои знания датируются этой областью). Это может быть интересным способом заставить алгоритмы высокого уровня напрямую пережевывать данные из USB-канала для чего-то в этом роде. . . крутая вещь!

person TheEruditeTroglodyte    schedule 25.12.2009
comment
Проблема с Oracle JNI заключается в том, что код C ++ должен быть структурирован очень специфическим образом. то есть имена ваших методов C ++ должны соответствовать имени вашего потребляющего класса java (имхо немного неудобно). Итак, если вы хотите использовать существующие библиотеки DLL, вам все равно нужно будет написать оболочку на C ++. - К счастью, есть другой способ. Существуют более мощные коммерческие альтернативы JNI. (например, jacozoom и comjni). Но поскольку существует так много типов DLL-файлов с небольшой прозрачностью, эти инструменты не всегда работают. Это процесс проб и ошибок, успех не гарантирован. - person bvdb; 05.08.2017

Драйверы устройств пользовательского пространства PCIe могут быть написаны на Pure Java. См. JVerbs для получения подробной информации о прямом аппаратном обеспечении на основе памяти. доступ в контексте OFED. Это метод, который можно использовать для создания систем с очень высокой производительностью.

Вы можете исследовать шину PCI, чтобы определить области памяти для данного устройства, какие у него порты и т. Д. Области памяти могут быть отображены в процессе JVM.

Конечно, вы несете ответственность за все сами.

Я не сказал «легко». Я сказал, что возможно. ;)

См. Также Драйверы устройств в пространстве пользователя , в котором обсуждается использование инфраструктуры UIO для создания драйвера пользовательского пространства.

person Ross Judson    schedule 13.11.2013

Прежде всего, обратите внимание, что я не эксперт по драйверам устройств (хотя некоторые из них я написал в свое время), не говоря уже о Java.

Давайте на мгновение оставим в стороне тот факт, что написание драйверов устройств на языке высокого уровня - не лучшая идея (для производительности и, возможно, по многим другим причинам), и ответим на ваш вопрос.

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

Однако большинству драйверов устройств необходимо выполнять множество низкоуровневых функций, таких как обработка прерываний и взаимодействие с ОС с помощью API ОС и системных вызовов, что, как я полагаю, невозможно сделать в Java.

Но если ваше устройство обменивается данными, используя, скажем, последовательный порт или USB, и если ОС не обязательно должна знать об устройстве (только ваше приложение будет получать доступ к устройству *), тогда вы можете написать драйвер в любом язык, обеспечивающий необходимые средства для доступа к устройству.

Так, например, вы, вероятно, не можете написать драйвер карты SCSI на Java, но вы можете написать драйвер для проприетарного устройства управления, USB-лавовой лампы, лицензионного ключа и т. Д.

* Возникает очевидный вопрос, считается ли это водителем?

person Can Berk Güder    schedule 25.03.2009
comment
что я считаю, что вы не можете сделать на Java. во что еще вы верите? - person Ebuzer Taha KANAT; 03.01.2019