24

序章

Javaでデバイスドライバを作成することについて何か聞いたことがあり(インターネットからではなく「耳で」のように聞いた)、疑問に思っていました...デバイスドライバはオペレーティングシステムレベルで動作するため、同じ言語で作成する必要があると常に思っていましたOSとして(したがって、ほとんどの場合CIが想定します)

質問

  1. 私は一般的にこの仮定に誤りがありますか?(そのようです)
  2. 「異星」言語のドライバーをOSでどのように使用できますか?
  3. とにかく、デバイスドライバーの(プログラミング言語の観点からの)要件は何ですか?

読んでくれてありがとう

4

13 に答える 13

22

これを行うにはいくつかの方法があります。

まず、「OS レベル」で実行されるコードは、OS と同じ言語で記述する必要はありません。OS コードと一緒にリンクできればよいだけです。事実上すべての言語が C と相互運用できます。実際に必要なのはこれだけです。

言語的には、技術的には問題ありません。Java 関数は C 関数を呼び出すことができ、C 関数は Java 関数を呼び出すことができます。また、OS が C で記述されていない場合 (C++ で記述されているという議論のために言いましょう)、OS の C++ コードは中間の C コードを呼び出すことができ、それが Java に転送されます。C は、ほぼプログラミングの共通語です。

プログラムが (ネイティブ コードに) コンパイルされると、そのソース言語は関係なくなります。アセンブラは、コンパイル前にソース コードがどの言語で記述されていても、ほとんど同じように見えます。OSと同じ呼び出し規約を使えば問題ありません。

より大きな問題は、ランタイム サポートです。OS で利用できるソフトウェア サービスは多くありません。たとえば、通常、Java 仮想マシンはありません。(技術的に存在しない理由はありませんが、通常は、存在しないと想定しても安全です)。

残念ながら、Java バイトコードとしての「デフォルト」表現では、Java プログラム多くのインフラストラクチャーを必要とします。バイトコードを解釈して JIT する Java VM と、クラス ライブラリなどが必要です。

しかし、これを回避する方法が 2 つあります。

  • カーネルで Java をサポートします。これは珍しいステップですが、実行できます。
  • または、Java ソース コードをネイティブ形式にコンパイルします。Java プログラムを Java バイトコードにコンパイルする必要はありません。x86アセンブラにコンパイルできます。同じことが、使用するクラス ライブラリにも当てはまります。それらもアセンブラまでずっとコンパイルできます。もちろん、Java クラス ライブラリの一部には、使用できない特定の OS 機能が必要ですが、それらのクラスの使用は回避できます。

はい、それは可能です。しかし、それは簡単なことではなく、何を得ることができるかは不明です。

もちろん、別の問題として、Java では任意のメモリ位置にアクセスできないため、多くのハードウェア通信が非常に複雑になる可能性があります。しかし、おそらく、関連するメモリ領域を Java が処理する配列として返すだけの非常に単純な C 関数を呼び出すことによって、回避することもできます。

于 2009-03-26T00:02:03.027 に答える
20

Java でのSolaris デバイス ドライバの記述では、Java で記述された RAM ディスク デバイスについて説明します。

もう 1 つは Linux 用です。Java でも DD が必要な理由について詳しく説明します (他の投稿やコメントを見て疑問に思う人もいるので)。

于 2009-03-26T04:00:19.617 に答える
6

デバイス ドライバーにはさまざまな機能があります

私は実際に生計を立てるために Java でデバイス ドライバーを作成しています。スケールや計量デバイス、包装機、バーコード スキャナー、計量ブリッジ、バッグおよびボックス プリンターなどの産業用デバイスのドライバー... Java はここで本当に良い選択です。

いくつかの例

産業用デバイスは、ホーム/オフィス デバイス (スキャナ、プリンタなど) とは大きく異なります。特に製造業 (例: 食品) では、MES アプリケーション (例: Java で開発) を実行する中央サーバーを選択する企業がますます増えていますJavaはその両方ができる言語です。

ホーム/オフィス デバイスがコンピュータに組み込まれているか、USB ケーブルで接続されていることが多い場合、これらの産業用デバイスは通常、イーサネットまたは RS232 コネクタを使用します。したがって、本質的には、ほぼすべての言語がその仕事を行うことができます。

この分野の標準化はまだあまり進んでいません。ほとんどのベンダーは、自社のデバイス用に独自のプロトコルを作成することを好みます。結局のところ、彼らはハードウェア ビルダーであり、ソフトウェアの天才ではありません。その結果、プロトコルの多様性が非常に高くなります。単純なプレーンテキスト プロトコルを好むベンダーもあれば、CRC コードやフレーミングなどを使用した複雑なバイナリ プロトコルを好むベンダーもあります。強力な OOP 言語には、ここで多くの利点があります。

たとえば、Java が 100 ミリ秒/サイクルの連続速度で印刷されるのを見てきました。これには、独自のラベルの生成、プリンターへの送信、確認の受信、紙への印刷、空気圧を使用した製品への貼り付けが含まれます。

要約すると、Java の威力は次のとおりです。

  • 複雑なインターフェースとして、両方のビジネス ロジックに役立ちます。
  • ソケットとの通信では、C と同じくらい信頼性があります。
  • 一部のドライバーは、Java の OOP パワーの恩恵を受けることができます。
  • Java は十分に高速です。
于 2015-04-01T13:11:11.747 に答える
4

不可能ではありませんが、おそらく難しく、あまり意味がありません。

可能です。Java は通常のプログラミング言語であるため、データにアクセスする方法があれば問題ありません。通常、最新の OS では、カーネルには何らかの方法でハードウェアへの生のアクセスを許可するレイヤーがあります。また、ユーザー空間にはすでにドライバーが存在します。少なくともユーザー空間部分はJavaで実装するのに問題はないはずです。

カーネルはドライバーを実行するために JVM を起動する必要があるため、あまり意味がありません。また、JVM 実装は通常、多くのメモリを消費します。

プラットフォーム上でネイティブに実行されるようにコンパイルされた Java コードを使用することもできます (JVM の助けを借りずに)。これは通常それほど効率的ではありませんが、デバイス ドライバーには適している可能性があります。

問題は、ドライバーを Java で実装することに意味があるのか​​ということです。または別の言い方をすれば、ドライバーの実装に別の代替手段ではなく Java を使用した場合、どのような利点が期待できますか? この質問に答えることができれば、それを可能にする方法を見つける必要があります。

最後に、純粋に Java ベースの完全な OS を実装しようとするプロジェクトであるJNodeへのヒントがあります。

于 2009-03-25T22:17:51.297 に答える
3

JDDKへの言及を聞いたことがありますか?

Javaでデバイスドライバーを100%作成することは、(1)OS固有のドライバーエントリポイントと規則、および(2)JVMインスタンス間の相互作用を提供するネイティブコードなしでは不可能です。JVMインスタンスは、「インプロセス」で開始することも(「インプロセス」は、OSによって、およびドライバーがカーネルモードドライバーかユーザーモードドライバーかによって異なる意味を持つ場合があります)、または別のユーザーランドとして開始することもできます。薄いネイティブのドライバー適応レイヤーが通信でき、その上で前述のドライバー適応レイヤーが実際のユーザーランド作業をオフロードできるプロセス。

于 2009-03-25T22:14:49.790 に答える
3

デバイス ドライバーの視野が狭すぎます。

私は自動車用アプリケーションで MOST の上にそのようなデバイス ドライバを書きました。Java が適切な USB ライブラリを取得した場合、USB デバイスのドライバがより広く使用される可能性があります。

このような場合、ネイティブ コードで処理される一般的な低レベル プロトコルがあり、Java ドライバーがデバイスの仕様 (データ形式、ステート マシンなど) を処理します。

于 2009-03-26T07:06:40.010 に答える
2

Java コードをハードウェア ネイティブ (つまり、JVM バイトコードではない) 命令にコンパイルすることが可能です。たとえばGCJを参照してください。これがあれば、以前よりもはるかにデバイス ドライバーをコンパイルできるようになります。

実用性はわからないけど。

于 2009-03-25T22:17:53.870 に答える
2

可能?

はい、ただし特別な状況でのみ。Java と C# でオペレーティング システムを記述できるため、そのためのデバイス ドライバーを記述できるはずです。これらのドライバとオペレーティング システムへのメモリ ヒットは相当なものです。

ありそう?

ありそうもない。少なくとも、Windows や MacOS、さらには Linux の世界ではありません... 少なくともすぐにはそうではありません。C# や Java などの言語は CLR と JVM に依存しているためです。これらの言語が動作する方法は、効果的に ring0 にロードできないことを意味します。

また、マネージド言語がデバイス ドライバーで採用されている場合、パフォーマンスへの影響はかなり大きくなります。

于 2009-03-25T22:20:51.507 に答える
2

動機として、C よりも優れたプログラミング用の高速言語がたくさんあることを覚えておいてください。それらは C ほど速くはないかもしれませんが、安全な言語です: 間違いを犯しても、未定義の動作が発生することはありません。また、「未定義の動作」には、HD をフォーマットする攻撃者によって提供された任意のコードの実行が含まれます。多くの関数型言語は通常、ネイティブ コードにコンパイルされます。

デバイス ドライバーには、OS カーネルに最も多くのバグが含まれています。Linux の場合 (Linus Torvalds や他の人がそう言い続けています)、Windows の場合もそうです。ディスクまたはイーサネット ドライバーには最高のパフォーマンスが必要です、今日の Linux ドライバーは 10G イーサネットまたは SSD ディスクのボトルネックになっていますが、ほとんどのドライバーはそれほど速度を必要としません。すべてのコンピューターが同じ速度で待機します。

そのため、カーネルの外部で実行されるドライバーを作成できるようにするためのさまざまなプロジェクトが存在します。それができれば、好きな言語を使うことができます。その場合、使用するハードウェア制御ライブラリの Java バインディングが必要になります。ドライバを C で記述している場合でも、C バインディングを含むライブラリが必要です。

適切なカーネル モードのドライバーには、まだ言及されていない 2 つの問題があります。

  • ガベージ コレクションです。これは厳しい要件です。カーネル内のガベージ コレクターを作成する必要があります。一部の GC アルゴリズムは仮想メモリに依存しており、それらを使用することはできません。さらに、おそらく OS メモリ全体をスキャンして、GC のルートを見つける必要があります。最後に、(ソフト) リアルタイム GC を保証するアルゴリズムのみを信頼すると、オーバーヘッドがさらに大きくなります。Linux 上の Java デバイス ドライバーについて言及された論文を読むと、彼らはあきらめて、プログラマーが手動でメモリを解放する必要があります。彼らはこれが安全性を損なうことはないと主張しようとしていますが、私は彼らの議論が説得力があるとは思いません.安全な言語のためにガベージコレクションが必要であることを彼らが理解しているかどうかさえ明らかではありません.

  • リフレクションとクラスの読み込み。完全な Java 実装は、ネイティブ コードを実行している場合でも、新しいコードをロードできる必要があります。これは回避できるライブラリですが、カーネルにインタープリターまたは JIT コンパイラーがある場合 (技術的に不可能にする本当の理由はありません)。

  • パフォーマンス。Linux 上の JVM に関する論文は非常に悪く、そのパフォーマンスの数値は説得力がありません。実際、彼らは USB 1.1 ネットワーク ドライバをテストし、パフォーマンスがそれほど悪くないことを示しています! しかし、十分な努力をすれば、もっと良いことができるはずです。

最後に 2 つのこと:

  • Singularity について言及したいと思います。これは、C# バリアントで記述された完全な OS であり、ネイティブ言語のハードウェア アブストラクション レイヤーのみを備えています。
  • picoJava については、システムがスマート カードのように実際にメモリに制約のあるシステムでない限り、それを使用するのはお勧めできません。Cliff Click はすでにその理由を説明しています。適切な JIT を記述するとパフォーマンスが向上し、最近ではスマートフォンでもそれをサポートできます。
于 2011-01-24T22:49:47.973 に答える
1

Windows Driver Foundation (WDF) は、ユーザーモードとカーネルモードの両方のデバイス ドライバーを作成できる Microsoft API です。これは現在行われており、現在は w2k 以降と互換性があります (サポート対象として w2k がありませんでした)。JRE で何らかの作業を行うために JNI 呼び出しを実行できない理由はありません。. . (JNI が依然として C/C++ から Java を呼び出す方法であると仮定すると. . . 私の知識はその分野では古いものです)。これは、高レベルのアルゴリズムが USB パイプからのデータを直接処理して、その効果を得る興味深い方法となる可能性があります。. . クール!

于 2009-12-25T02:53:08.810 に答える
1

デバイス ドライバーは、カーネル内で実行できる言語で作成するか、カーネルにコンパイルするか、実行時にモジュールとしてロードする必要があります。これは通常、Java でデバイス ドライバーを作成することを妨げますが、理論的には、デバイス ドライバー内に JVM を実装し、Java コードを実行させることができると思います。正気な人がそうしたいと思うわけではありません。

Linux では、(fuse) と呼ばれる共通の抽象化レイヤーを使用するファイルシステムのユーザーランド (つまり、非カーネル) の実装がいくつかあります。これにより、ユーザーランドのプログラムは通常カーネルで行われることを実装できます。

于 2009-03-25T22:19:04.257 に答える
1

PCIe ユーザー空間のデバイス ドライバーは、Pure Java で記述できます。OFEDのコンテキストでのメモリベースの直接ハードウェア アクセスの詳細については、JVerbsを参照してください。これは、非常に高性能なシステムを作成するために使用できる手法です。

PCI バスを調べて、特定のデバイスのメモリ領域、デバイスのポートなどを特定できます。メモリ領域は、JVM のプロセスにマップできます。

もちろん、すべてを自分で実装する責任があります。

簡単とは言いませんでした。可能だと言いました。;)

UIO フレームワークを使用してユーザー空間ドライバーを構築する方法について説明している「ユーザー空間のデバイス ドライバー」も参照してください。

于 2013-11-13T20:11:39.940 に答える
-1

まず第一に、私はデバイス ドライバーの専門家ではないことに注意してください。

高水準言語でデバイス ドライバーを作成することは (パフォーマンスやその他の多くの理由から) 良い考えではないという事実をしばらく脇に置き、あなたの質問に答えましょう。

少なくとも理論上は、ほとんどすべての言語でデバイス ドライバーを作成できます。

ただし、ほとんどのデバイスドライバーは、割り込みの処理や、OS API とシステムコールを使用した OS との通信など、多くの低レベルの処理を行う必要がありますが、これは Java では実行できないと思います。

ただし、デバイスがシリアル ポートや USB などを使用して通信し、OS が必ずしもデバイスを認識する必要がない場合 (アプリケーションのみがデバイスにアクセスします*)、任意の形式でドライバーを記述できます。デバイスにアクセスするために必要な手段を提供する言語。

たとえば、おそらく Java で SCSI カード ドライバーを作成することはできませんが、独自の制御デバイス、USB 溶岩ランプ、ライセンス ドングルなどのドライバーを作成することはできます。

* ここでの明白な質問は、もちろん、それはドライバーとして数えられるかということです。

于 2009-03-25T22:25:03.633 に答える