Neugierde jenseits von Abstraktionen: Wie wird Bytecode ausgeführt? Wie funktionieren Gerätetreiber?

8

Alles, was ich auf * nix gesehen habe, ist eine Sammlung von Abstraktionen von der Hardware, aber ich bin neugierig, wie die Hardware funktioniert.
Ich habe in Assembly programmiert, aber das ist immernoch nur eine Reihe von Abstraktionen.

Wie versteht ein Prozessor Assembler-Opcodes (als Bytecode)?
Wie funktionieren Gerätetreiber (mit einer Erklärung auf einer niedrigeren Abstraktionsebene)?

    
Yktula 23.05.2010, 15:35
quelle

4 Antworten

1

Wow .... riesige Frage! Auf der Wurzelebene kann der Prozessor mit der Hardware über spezielle Anweisungen kommunizieren, z. IN und OUT zu I / O-Ports auf x86-Hardware und / oder irgendeine Form von speicherabgebildeten I / O-Regionen.

Unterschiedliche Hardware hat dann sehr unterschiedliche Protokolle / Regeln, wie man über diese Kanäle kommuniziert und wird im Allgemeinen wahrscheinlich schrecklich scheitern, wenn diese Regeln nicht befolgt werden. Ein Beispiel wäre ein Ausgabegerät, das nur eine begrenzte Anzahl von Übertragungen pro Sekunde verarbeiten kann. Daher muss der Treiber prüfen, ob die Hardware bereit ist, mehr Daten zu senden, bevor er versucht, etwas zu übertragen. In der Regel müssen Sie auch sicherstellen, dass nicht gleichzeitig versucht wird, auf dasselbe Gerät zuzugreifen. Dies ist einer von vielen guten Gründen, warum Betriebssysteme Benutzerprogrammen nicht erlauben, direkt auf die Hardware zuzugreifen, wann immer ihnen danach ist.

Warum nicht einen Blick auf den Linux-Quellcode werfen, um Ihre Neugier zu befriedigen?

Linux-Kernel-Treiber

Beachten Sie, dass das meiste davon in C geschrieben ist, nicht in der Assemblersprache. Es gibt keine strenge Anforderung, die Assemblersprache zum Schreiben von Gerätetreibern zu verwenden, vorausgesetzt, Sie verfügen über die erforderlichen Anweisungen zur Kommunikation mit der Hardware (was in C zutrifft, in einigen höheren Programmiersprachen jedoch nicht zutrifft).

    
mikera 17.05.2010, 12:54
quelle
3

Gerätetreiber bilden eine Schnittstelle zwischen der Geräte-API eines Betriebssystems und den tatsächlichen Hardwareregistern.

Das Linux-Gerät-API-Modell ist eine Fortsetzung des allgemeineren Linux-Konzepts, dass alles eine Datei ist und dass eine Anwendung alles, was sie benötigt, mit dem open (), read (), write (), ioctl () ausführen kann. und close () -Schnittstelle. Unter der Haube gibt es eine install () - Routine, aber das Betriebssystem entscheidet, wann es aufgerufen wird.

Die andere Seite der Münze ist Hardware. Die CPU greift auf Geräteregister entweder mit speziellen E / A-Befehlen oder gewöhnlichen Speicherzugriffen auf spezielle Speicherstellen zu, die mit der Hardware verbunden sind. Während Hardware-Register wie Speicher funktionieren können, können sie Dinge tun, die der Speicher nicht kann. Ziemlich häufig kann das Schreiben in eines der Register eines Geräts die Werte einiger seiner anderen Register ändern und kann bis zu dem Punkt durch elektrische Aktivität in der angeschlossenen Hardware geändert oder geändert werden.

Gerätetreiber überbrücken diese Lücke. Da die Möglichkeiten für Gerätetypen nahezu unbegrenzt sind, ist es schwierig, über nur einige wenige Punkte zu verallgemeinern, wie Funktionen abgebildet werden. Die Routine install () wird zum Zeitpunkt des Starts des Systems getroffen, konfiguriert die Register für den ordnungsgemäßen Betrieb, normalerweise beinhaltet dies das Einrichten des Interrupt-Dienstes und der Verarbeitung; Die Routine open () gibt einer Anwendung eine logische Verbindung mit dem Gerät. Es gibt normalerweise eine Anstrengung, um lese () und write () Daten auf eine vernünftige Art und Weise zu verschieben, obwohl man manchmal sieht, dass diese als No-Ops implementiert sind; und die Einstellungen für das On-the-Fly-Gerät werden über ioctl () gesteuert. Und natürlich ist die Hauptaufgabe von close (), die Arbeit von open () rückgängig zu machen, wobei besonders darauf geachtet wird, alle von open () erfassten Systemressourcen freizugeben.

Nun, das ist jedenfalls der Linux-Fokus. Das Windows-Modell, zumindest das, das ich kenne (wahrscheinlich datiert), neigt dazu, Bibliotheken von gerätespezifischen Funktionsaufrufen anzubieten.

    
JustJeff 22.05.2010 17:38
quelle
2

Geräte haben einen "Interrupt" - so signalisieren sie, dass sie die Aufmerksamkeit des Prozessors haben wollen.

Gerätetreiber haben eine "Interrupt-Service-Routine" - das ist der Code, der ausgeführt wird, wenn auf diesem Gerät ein Interrupt auftritt.

Gerätetreiber lesen oder schreiben dann Daten in einem Low-Level-Formular, das dem Gerät zugeordnet wird - in der Regel entweder Zeichen oder Datenblöcke. Die höheren Ebenen des Gerätetreibers verwalten das Packen, Entpacken, Puffern und Übersetzen von den Daten der unteren Ebene zu Daten der höheren Ebene, wie zum Beispiel Zeilen mit Textzeichen.

Es ist ziemlich einfach in seinen Grundlagen, aber es wird sehr schnell kompliziert, wenn Sie mehrere Geräte hinzufügen, mehrere Benutzer, den Status für beide verfolgen, und viele andere Abstraktionen, wie ein Dateisystem, zusätzlich zum blockorientierten Hauptgerät I /O.

    
Steven D. Majewski 18.05.2010 16:31
quelle
2

"The Art of Assembly" ist ein gutes, aber irgendwie veraltetes Buch mit Erklärungen zu so ziemlich allem, was Hardware und Low-Level betrifft. Du solltest es lesen.

Es ist legal online und in gedruckter Form verfügbar.

Das Buch, online

Auf Amazon

EDIT: Commenter Samoz erwähnt eine neue Ausgabe, jetzt ist es wahrscheinlich auf dem neuesten Stand!

    
Francisco P. 22.05.2010 18:12
quelle