Frage

Einführung

hörte ich etwas über Gerätetreiber in Java zu schreiben (zu hören, wie in „mit den Ohren“, nicht aus dem Internet) und frage mich ... ich immer Fahrer dachte Gerät auf Betriebssystemebene betrieben und somit geschrieben werden müssen die gleiche Sprache wie die OS (also meist CI suppose)

Fragen

  1. Bin ich mit diesem im Allgemeinen falsch Annahme? (Es scheint so)
  2. Wie kann ein Fahrer in einem „fremden“ Sprache in dem O verwendet werden?
  3. Was sind die Anforderungen (von a Programmiersprache Sicht) für einen Gerätetreiber überhaupt?

Danke für das Lesen

War es hilfreich?

Lösung

Es gibt ein paar Möglichkeiten, dies getan werden kann.

Als erstes Code auf „OS-Ebene“ laufen muss nicht in derselben Sprache wie das Betriebssystem geschrieben werden. Es hat lediglich in der Lage sein, zusammen mit O Code verknüpft werden. Praktisch alle Sprachen mit C zusammenarbeiten können, was wirklich alles ist, was gebraucht wird.

So spricht weise, gibt es technisch kein Problem. Java-Funktionen können C-Funktionen aufrufen und C-Funktionen können Java-Funktionen aufrufen. Und wenn das Betriebssystem nicht in C geschrieben wird (sagen wir, aus Gründen der Argumentation, dass es in C geschrieben ++), dann ist die OS C ++ Code kann in einem Zwischen C-Code aufrufen, die auf Ihre Java leitet, und umgekehrt. C ist so ziemlich ein lingua franca der Programmierung.

Sobald ein Programm zusammengestellt (zum nativen Code), ist seine Ausgangssprache nicht mehr relevant. Assembler sieht viel die gleichen, unabhängig davon, welche Sprache der Code-Quelle wurde vor der Kompilierung geschrieben. Solange Sie die gleiche Aufrufkonvention als O verwenden, ist es kein Problem.

Ein größeres Problem ist die Laufzeitunterstützung. Nicht viele Software-Services sind in der OS zur Verfügung. Es ist in der Regel keine virtuelle Java-Maschine, zum Beispiel. (Es gibt keinen Grund, warum es könnte technisch nicht sein, aber in der Regel, aber in der Regel, es ist sicher anzunehmen, dass es nicht vorhanden ist).

Leider ist in seiner "default" Darstellung, wie Java-Bytecode, ein Java-Programm erfordert eine Menge Infrastruktur. Es braucht die Java VM zu interpretieren und JIT den Bytecode, und es muss die Klassenbibliothek und so weiter.

Aber es gibt zwei Möglichkeiten, um diesen:

  • Unterstützung Java im Kernel. Dies wäre ein ungewöhnlicher Schritt sein, aber es könnte getan werden.
  • Oder kompilieren Java-Quellcode zu einem nativen Format. Ein Java-Programm muss nicht auf Java-Bytecode kompiliert werden. Man könnte es auf x86-Assembler kompilieren. Das gleiche gilt für alles, was Klassenbibliotheken Sie verwenden. Diejenigen, auch konnte den ganzen Weg zu Assembler kompiliert werden. Natürlich Teile der Java-Klassenbibliothek erfordern bestimmte OS-Funktionen, die nicht verfügbar sein werden, aber dann diese Klassen verwenden könnte vermieden werden.

Also ja, es kann getan werden. Aber es ist nicht einfach, und es ist unklar, was man gewinnen.

Natürlich kann ein anderes Problem sein, dass Java nicht zulassen, Sie beliebige Speicherplatz zugreifen, die eine Menge Hardware-Kommunikation machen würde ziemlich schwierig. Aber auch, um gearbeitet werden könnte, vielleicht, indem sie in sehr einfachen C-Funktionen aufrufen, die einfach die entsprechenden Speicherbereiche als Arrays zurückgeben für Java zu arbeiten.

Andere Tipps

Schreiben Solaris-Gerätetreiber in Java umfasst ein RAM-Disk-Gerät geschrieben in Java.

eine andere für Linux . Geht mehr in die Tiefe auf, warum Sie einen DD in Java wollen auch (da einige Leute von den Blicken der anderen Beiträge und Kommentare fragen wurden)

Es ist nicht unmöglich, aber vielleicht macht hart und vielleicht nicht viel Sinn.

Möglich ist es, weil Java eine normale Programmiersprache ist, solange Sie eine Möglichkeit haben, auf die Daten zuzugreifen, ist es kein Problem. Normalerweise in einem modernen Betriebssystem hat der Kernel eine Schicht roh Zugriff auf die Hardware in irgendeiner Weise zu ermöglichen. Auch bereits Treiber im Userspace existiert, zumindest die User-Space-Teil kein Problem in Java zu implementieren sein sollte.

Es ist vielleicht nicht allzu viel Sinn, da der Kernel eine JVM zu starten hat den Treiber auszuführen. Auch JVM-Implementierungen normalerweise fressen viel Speicher.

Sie können auch Java-Code kompiliert verwenden nativ auf der Plattform (nicht mit Hilfe einer JVM) ausgeführt werden. Dies ist in der Regel nicht so effizient, aber es könnte für einen Gerät-Fahrer geeignet sein.

Die Frage ist, macht es Sinn, den Treiber in Java zu implementieren? Oder anders gesagt: Was ist der Nutzen, den Sie hoffen, wenn Sie Java verwenden für die Implementierung des Treibers anstelle einer anderen Alternative? Wenn Sie diese Frage beantworten können, sollten Sie einen Weg finden, um es möglich zu machen.

Am Ende des Hinweis auf Jnode , ein Projekt, das ein komplettes Betriebssystem zu implementieren versucht, rein auf Basis von Java.

Ein Gerätetreiber könnte eine Menge Dinge,

sein

Ich schreibe eigentlich Gerätetreiber in Java für ein Leben: Treiber für industrielle Geräte , wie Waagen oder Waagen, Verpackungsmaschinen, Barcode-Scanner, Brücken, Tasche und Box-Druckers mit einem Gewicht, ... Java ist eine wirklich gute Wahl hier.

Industriegeräte sind sehr verschieden von zu Hause / Büro Geräten (zum Beispiel Scanner, Drucker) . Vor allem bei der Herstellung (zB Lebensmittel), entscheiden sich Unternehmen immer mehr für einen zentralen Server, die eine MES-Anwendung läuft (zB in Java entwickelt) Der MES-Server muss mit den Geräten der Produktionslinie verbinden, enthält aber auch Business-Logik . Java ist eine Sprache, die beides kann.

Wo Ihr Haus / Büro-Geräte werden oft eingebaut, um Ihren Computer oder mit einem USB-Kabel angeschlossen ist, diese Industriegeräte verwenden in der Regel Ethernet oder RS232-Anschlüsse. Also, im Grunde, so ziemlich jede Sprache die Arbeit machen kann.

Es gibt nicht viel Standardisierung in diesem Bereich vor. Die meisten Hersteller bevorzugen ihr eigenes Protokoll für ihre Geräte zu erstellen. Schließlich sind sie Hardware-Builder, keine Software-Genies. Das Ergebnis ist, dass es eine große Vielfalt von Protokollen ist. Einige Hersteller bevorzugen einfache Klartext-Protokolle, aber andere bevorzugen komplexe binäre Protokolle mit CRC-Codes, Rahmung, ... Manchmal sie mehrere Protokolle (zum Beispiel ein herstellerspezifischen Handshaking-Algorithmus auf einer OPC-Schicht) stapeln möchten. Eine starke OOP-Sprache hat viele Vorteile hier.

  

z. Ich habe mit einer kontinuierlichen Geschwindigkeit von 100 ms / Zyklus java Druck gesehen. Dazu gehört auch eine eindeutige Markierung zu erzeugen, ist es an den Drucker senden, eine Bestätigung empfängt, druckt sie auf Papier und es auf das Produkt unter Verwendung von Luftdruck angelegt wird.

Zusammenfassend ist die Leistung von Java:

  • Es ist sowohl für Geschäftslogik als komplexe Schnittstellen nützlich.
  • Es ist genauso zuverlässig in Verbindung mit Steckdosen als C.
  • kann Einige Treiber von Java OOP Macht benifit.
  • Java ist schnell genug.

Sie haben eine zu enge Sicht auf Gerätetreiber.

Ich habe solche Gerätetreiber geschrieben oben auf MOST in einer Automobilanwendung. Eine breitere Anwendung könnte Treiber für USB-Geräte, wenn Java jemals eine anständige USB-Bibliothek wird.

In diesen Fällen gibt es ein generisches Low-Level-Protokoll, das in nativen Code behandelt wird, und die Java-Treiber verarbeitet die Geräte Besonderheiten (Datenformate, Zustandsmaschinen, ...).

Haben Sie vielleicht einen Verweis auf die JDDK ?

Schreiben Sie einen Gerätetreiber 100% in Java ist nicht möglich, ohne nativen Code , um die Interaktion zwischen (1) dem OS-spezifischen Treiber Einspeisepunkten und Konventionen zur Verfügung zu stellen, und (2) die JVM-Instanz. Die JVM-Instanz könnte gestartet werden „in-process“ (und „in-process“ unterschiedliche Bedeutungen haben können auf dem OS abhängig und davon, ob der Fahrer ein Kernel-Modus oder Benutzer-Modus-Treiber ist), oder als separate Benutzer-Land Verfahren, mit dem eine dünne, nativen Treiber Anpassungsschicht und auf dem der Fahrer die Anpassung kommunizieren Schicht tatsächliche benutzer Land Arbeit auslagern.

Es ist möglich Java-Code auf Hardware nativen (das heißt nicht JVM Bytecode) Anweisungen zu kompilieren. Siehe zum Beispiel GCJ . Mit diesem in der Hand, sie ist ein gutes Stück näher zu der Möglichkeit, Gerätetreiber zu kompilieren als vorher.

Ich weiß nicht, wie praktisch es ist, though.

möglich?

Ja, aber nur unter besonderen Umständen. Da Sie ein Betriebssystem in Java und C # schreiben, und dann sollte der Lage sein, Gerätetreiber für sie zu schreiben. Der Speicher treffen auf diese Treiber und Betriebssysteme wären erheblich.

Wahrscheinliche?

Nicht wahrscheinlich. Zumindest nicht in der Welt von Windows oder MacOS oder sogar Linux ... zumindest nicht in absehbarer Zeit. Da Sprachen wie C # und Java ist abhängig von der CLR und JVM. Die Art, wie diese Sprachen zu arbeiten bedeutet, dass sie nicht effektiv in ring0 geladen werden können.

Auch wäre die Leistungseinbußen ziemlich groß, wenn verwalteten Sprachen in Gerätetreiber eingesetzt wurden.

Für die Motivation, denken Sie bitte daran, dass es viele schnelle Sprachen, die als C für die Programmierung besser sind; sie könnten nicht so schnell wie C, aber sie sind sicher Sprachen: Wenn Sie einen Fehler, den Sie nicht bekommen, nicht definiertes Verhalten machen. Und „nicht definiertes Verhalten“ umfasst durch einen Angreifer beliebigen Code geliefert Ausführung, die HD-Formate. Viele funktionalen Sprachen sind in der Regel zu nativen Code kompiliert.

Gerätetreiber enthalten die meisten Fehler in einem OS-Kernel - Ich weiß, dass für Linux (Linus Torvalds und andere sagen, halten so) und ich hörte, dass für Windows. Während für eine Platte oder Ethernet-Treiber Sie erstklassige Leistung benötigen, und während in Linux heute Treiber sind der Engpass für 10G Ethernet oder SSD Festplatten, die meisten Treiber benötigen nicht so viel Geschwindigkeit - alle Computer warten mit der gleichen Geschwindigkeit.

Aus diesem Grunde gibt es verschiedene Projekte schriftlich Fahrer zu ermöglichen, die außerhalb des Kernels laufen, auch wenn die eine Verlangsamung verursacht; wenn Sie das tun können, können Sie welche Sprache Sie verwenden möchten; Sie werden nur dann für die Hardware-Control-Bibliothek Java Bindings müssen Sie verwenden -. wenn Sie den Treiber in C geschrieben haben, würden Sie noch eine Bibliothek mit C-Bindungen haben

Für Treiber im Kernel-Modus richtig, gibt es zwei Probleme, die ich noch nicht erwähnt gesehen:

  • Garbage Collection, und das ist eine schwierige Anforderung. Sie benötigen einen im Kernel Garbage Collector zu schreiben; einige GC-Algorithmen basieren auf den virtuellen Speicher, und Sie können sie nicht verwenden. Darüber hinaus müssen Sie wahrscheinlich die ganzen OS-Speicher zu finden Wurzeln für die GC scannen. Abschließend möchte ich nur einen Algorithmus bürge (weich) in Echtzeit GC vertrauen, die den Overhead machen würde noch größer. Lesen Sie das Papier, die über Java-Gerätetreiber auf Linux erwähnt wurde, geben sie einfach auf, und Programmierer benötigen, um manuell freien Speicher. Sie versuchen, zu argumentieren, dass dies nicht die Sicherheit gefährden, aber ich glaube nicht, ihr Argument überzeugend ist - es ist nicht einmal klar, ob sie verstehen, dass Garbage Collection für eine sichere Sprache benötigt wird,

  • .
  • Reflektionen und das Laden von Klassen. Eine vollständige Java-Implementierung, auch wenn nativen Code ausgeführt wird, muss in der Lage sein, neuen Code zu laden. Dies ist eine Bibliothek, die Sie vermeiden können, aber wenn Sie einen Dolmetscher oder JIT-Compiler in Kernel (und es gibt keinen wirklichen Grund, dass es technisch unmöglich macht).

  • Performance. Das Papier über eine JVM auf Linux ist sehr schlecht, und ihre Performance-Zahlen sind nicht überzeugend - in der Tat, sie testen einen USB 1.1-Netzwerktreiber, und dann zeigen, dass die Leistung nicht so schlecht! Doch genug Mühe etwas besser kann sicher durchgeführt werden gegeben.

Zwei letzte Dinge:

  • Ich mag Singularity erwähnen, die ein komplettes Betriebssystem in einer C # Variante geschrieben ist, mit nur einem Hardware Abstraction Layer in der Muttersprache.
  • über Picojava, es ist eine schlechte Idee, es zu benutzen, es sei denn, Ihr System ein wirklich Speicher eine gezwungen, wie eine Smartcard. Cliff Klicken Sie schon erklärt, warum:. Es eine bessere Leistung gibt einen guten JIT zu schreiben, und heute sogar Smartphones kann man erkennen, unterstützen

Gerätetreiber in einer Sprache geschrieben werden, die in dem Kernel ausführen können, entweder kompilierten hinein, oder als ein Modul zur Laufzeit geladen. Dies schließt in der Regel Gerätetreiber in Java zu schreiben, aber ich nehme an, Sie theoretisch eine JVM in einem Gerätetreiber implementieren könnte und lassen Sie es Java-Code auszuführen. Nicht, dass jeder vernünftige Mensch würde das tun wollen.

Unter Linux gibt es mehrere Benutzer-Land (dh nicht-Kernel) Implementierungen von Dateisystemen, die eine gemeinsame Abstraktionsschicht verwendet genannt (Sicherung), welche Programme Benutzer-Land erlaubt Dinge umzusetzen, die im Kernel normalerweise getan werden.

Der Windows Driver Foundation (WDF) ist ein Microsoft-API, die beide erlauben Benutzer und Kernel Mode-Gerätetreiber geschrieben werden. Dies wird heute getan, und es ist nun kompatibel mit w2k und später (nicht verwendet, um w2k als unterstütztem Ziel zu haben). Es gibt keinen Grund, dass JNI Anrufe können nicht einige Arbeit in der JRE zu tun gemacht werden. . . (Unter der Annahme, dass JNI noch die Art und Weise ist Java von C / C ++ zu nennen... Meine Kenntnisse in dieser Arena datiert). Dies könnte eine interessante Möglichkeit sein hohes Niveau Algorithmen direkt auf Daten von einem USB-Pipe für etwas in diesem Sinne knabbern zu haben. . . cool stuff!

PCIe Userspace-Gerätetreiber können in Pure Java geschrieben werden. Siehe JVerbs Details über speicherbasierte direkte Hardware Zugriff im Rahmen von OFED. Dies ist eine Technik, die verwendet werden können sehr hohe Performance-Systeme zu erstellen.

Sie können den PCI-Bus untersuchen die Speicherbereiche für ein bestimmtes Gerät zu bestimmen, welche Ports hat usw. Die Speicherbereiche in die JVM-Prozess abgebildet werden können.

Natürlich sind Sie verantwortlich für die Umsetzung alles selbst.

Ich habe nicht gesagt einfach. Ich sagte, möglich. ;)

Siehe auch Gerätetreiber in User Space , die diskutiert die UIO Rahmen mit einem User-space-Treiber zu bauen.

Zunächst einmal anmerken, dass ich bin kein Experte für Gerätetreiber (obwohl ich ein paar mich wieder in den Tag geschrieben hat), noch viel weniger ein Experte für Java.

Lassen Sie uns die Tatsache verlassen, dass in einer Hochsprache Gerätetreiber schreiben, ist keine gute Idee (für Leistung und möglicherweise viele andere Gründe) für einen Augenblick beiseite, und Ihre Frage beantworten.

Sie können Schreibgerätetreiber in nahezu jeder Sprache, zumindest in der Theorie.

Allerdings die meisten Gerätetreiber brauchen viel Low-Level-Zeug zu tun, wie Unterbrechungen der Handhabung und mit dem Betriebssystem in Verbindung steht, die OS APIs und Systemaufrufe verwenden, die ich glaube, Sie nicht in Java tun können .

Aber, wenn Sie das Gerät verwenden in Verbindung steht, sagen wir, eine serielle Schnittstelle oder USB, und wenn das Betriebssystem nicht notwendigerweise müssen sich bewusst sein das Gerät sein (nur Ihre Anwendung wird das Gerät * Zugriff), dann können Sie schreiben die Fahrer in jeder Sprache, die die notwendigen Mittel bereitstellt, auf das Gerät zuzugreifen.

So zum Beispiel haben Sie wahrscheinlich nicht einen SCSI-Karte Treiber in Java schreiben, aber Sie können einen Treiber für eine proprietäre Steuergerät, USB Lavalampe, Lizenz-Dongle, usw. schreiben.

* Die offensichtliche Frage ist hier, natürlich, Zählt das als Fahrer?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top