ubuntuusers.de

INT 80h System Calls

Status: Gelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

HolgerBr

Anmeldungsdatum:
18. März 2008

Beiträge: 275

Wohnort: Bremen

Liebe Leute,

anstelle des aus der DOS-Welt bekannten Int 21h benutzt der Linux-Kernel ja den Int 80h. Allerdings fand ich nirgendwo im Netz eine Zusammenstellung der Funktionen, die über den Int 80h benutzt werden können. Ein Beispiel aus der DOS-Ecke wäre dieses:

Eingabe: AH := 30h

Ausgabe: AL = Hauptversionsnummer, AH=Nebenversionsnummer, BH=OEM-Seriennummer

Ein Beispiel, das die DOS-Version ermittelt. In Assembler würde der Aufruf so funktionieren:

mov ah,30h int 21h

In Pascal könnte das so aussehen:

uses dos;

var

cpu: registers;

Hauptversion: Integer;

Nebenversion: Integer;

Seriennummer: Integer;

begin

cpu.ah := $30;

Intr(20,cpu);

Hauptversion := cpu.al;

Nebenversion := cpu.ah;

Seriennummer := cpu.bh;

....

end.

Wie muß ich das unter Linux für den fpc-Compiler hinschreiben? Gibt es den Datentyp "registers" dort überhaupt? Und wo finde ich eine Tabelle der Funktionen des INT 80 mit den Systemsaufrufen?

Viele Grüße, Holger

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Lies syscalls(2) und die Handbuchseiten der einzelnen Systemaufrufe. Die ABI für Syscalls dürfte in der Kerneldokumentation erläutert sein. Diese ABI ist übrigens abhängig von der Architektur, der beschriebene Interrupt wird nur auf x86 verwendet, selbst bei x86_64 wird iirc eine eigene Assemblerinstruktion bereitgestellt (die aber wohl auch letztlich nur den Interrupt auslöst).

Im Allgemeinen aber hat sich die Welt seit DOS weiterentwickelt, und manuelle Systemaufrufe heute nicht mehr Zeichen guter Programmierung.

HolgerBr

(Themenstarter)

Anmeldungsdatum:
18. März 2008

Beiträge: 275

Wohnort: Bremen

Lunar schrieb:

Lies syscalls(2) und die Handbuchseiten der einzelnen Systemaufrufe. Die ABI für Syscalls dürfte in der

Steht nichts drüber drin.

Kerneldokumentation erläutert sein. Diese ABI ist übrigens abhängig von der Architektur, der beschriebene Interrupt wird nur auf x86 verwendet, selbst bei x86_64 wird iirc eine eigene Assemblerinstruktion bereitgestellt (die aber wohl auch letztlich nur den Interrupt auslöst).

Okay. Dann ist die Verwendung von Geräten unter Linux also der Anwendungsprogrammierung nicht zugänglich. Werde ich mein kleines Programm also unter DOS schreiben oder auf einem anderen Rechner. Schade. Ich hatte schon Hoffnungen gehegt, jetzt bin ich etwas enttäuscht. Die Zeiten, in denen man einfach mit rewrite(a,"serout:") eine serielle Schnittstelle zum Schreiben öffnet, sind wohl schon lange vorbei. Dabei war UCSD-Pascal so genial einfach....vielleicht packe ich einfach den Apple II wieder aus....

Im Allgemeinen aber hat sich die Welt seit DOS weiterentwickelt, und manuelle Systemaufrufe heute nicht mehr Zeichen guter Programmierung.

Ach, das schert mich wenig. Web 2.0 ist heute die Spitze des Eisbergs neumodischer Programmierung, und über diese Programmierung schreibe ich besser nichts. 😉

Viele Grüße, Holger

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Die Kommunikation mit Geräten machst du meines Wissens entweder über entsprechende Bibliotheken oder indem du dir manuell das gewünschte Gerät aus dem Verzeichnis /dev raussuchst und da reinschreibst. Das geht völlig ohne Assemblerprogrammierung. Ich habe es noch nie selbst gemacht, aber es würde mich schon sehr wundern, wenn ich mit dieser Einschätzung daneben liege.

HolgerBr

(Themenstarter)

Anmeldungsdatum:
18. März 2008

Beiträge: 275

Wohnort: Bremen

snafu1 schrieb:

Die Kommunikation mit Geräten machst du meines Wissens entweder über entsprechende Bibliotheken oder indem du dir manuell das gewünschte Gerät aus dem Verzeichnis /dev raussuchst und da reinschreibst. Das geht völlig ohne Assemblerprogrammierung. Ich habe es noch nie selbst gemacht, aber es würde mich schon sehr wundern, wenn ich mit dieser Einschätzung daneben liege.

Das mag ja so sein, aber Geräte müssen initialisiert werden. Diese Daten kann mit nicht einfach in /dev/ttySx reinschreiben, die gehören in das entsprechende Kontrollregister auf dem Chip der seriellen Schnittstelle. Genau das erledigt der Systemsaufruf unabhängig vom im Rechner verwendeten Bauteil, und genau den finde ich für Linux nirgendwo, und genau danach habe ich gefragt - und als Antwort erhalten, daß sich eine solche Initialisierung nicht mehr gehören würde unter Linux, weswegen ich dann also wieder auf DOS ausweichen muß, wenn ich über die serielle Schnittstelle angeschlossene Geräte benutzen will. Ich finde das schade und hätte mir gerne ein Kommandozeilenprogramm geschrieben, um ein Programmiergerät für EPROMs zu steuern. Nun denn, mache ich das eben unter DOS, geht ja nicht anders. Ist nur umständlicher, wenn ich zwecks Benutzung des Gerätes jedesmal von Diskette oder vom Stick ein MS-DOS booten muß, obwohl ich auf der Festplatte doch Linux habe. Aber dies sei eben der modernen Programierung geschuldet.

Grüße, Holger

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@HolgerBr: Natürlich stehen die Systemaufrufe in syscalls(2) beschrieben. Von dort wird auf die einzelnen Funktionen verwiesen. Die Nummer des Systemaufrufs steht in der Kernel-Dokumentation oder in den Headern, auf die in sys/syscall.h verwiesen wird.

Um Geräte anzusprechen, gibt es die Gerätedateien im /dev/-Verzeichnis [1], auf die Bibliotheken wie libusb (C) oder pyserial (Python) aufsetzen. Damit ist es in jeder Programmiersprache möglich, Geräte zu steuern, sofern der Kernel einen Treiber besitzt. Selbst wenn man aber einen Gerätetreiber im Kernel implementieren muss, geschieht dies in C, nur der absolut nötige Teil wird in Assembler programmiert.

Nachtrag: Die serielle Schnittstelle muss auch heute noch initialisiert werden. Nur geschieht das im Interesse der Portabilität nicht mehr über Registerzugriffe, sondern über eine klar definierte Userspace-Schnittstelle. Wie diese Schnittstelle aussieht, kann ich Dir mangels Kenntnissen nicht sagen, aber ich denke, Du kannst selbst im Netz nach entsprechenden Einführungen suchen. Es steht Dir allerdings auch der Weg offen, einfach eine komfortable Bibliothek wie pyserial oder die Java Communications API zu verwenden.

  • 1: Die serielle Schnittstelle ist beispielsweise /dev/ttyS0

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@HolgerBr: Du ziehst falsche Schlussfolgerungen. Geräteprogrammierung ist Anwendungsprogrammen in den meisten Fällen doch zugänglich, und zwar unabhängig von der Hardwareplattform durch Treiber und virtuelle Dateien. Nämlich meistens genau auf der Ebene, wie Dein Pascal-Beispiel mit dem rewrite(a,"serout:"). Nur geraten, aber wahrscheinlich ist /dev/ttyS0 etwas ähnliches wie serout:. Und das ist letztendlich auch kein "neumodischer" Kram, denn Unix und UCSD-Pascal sind beide schon ziemlich alt, und seit dem gibt es diesen besseren Programmierstil als bei DOS. DOS läuft nur auf 32-Bit x86 Rechnern, da kann man es sich erlauben hardwareabhängig zu programmieren. Unix, UCSD-Pascal, und Linux dagegen sind von vorn herein darauf ausgelegt auf "beliebiger" Hardware zu laufen. Damit die Programme dann auch überall laufen, muss man eine Abstraktionsschicht einziehen.

Falls der serielle Port Dein Ziel ist, gibt's zum Beispiel als Grundlagentext das Serial HOWTO. Da sind gleich am Anfang noch weitere Dokumente erwähnt, die sich mit der Materie beschäftigen.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Glaubst du allen Ernstes, dass keine abstrahierte Programmierung von seriellen Schnittstellen unter Linux möglich ist? Ich komme aus dem Python-Bereich und weiß z.B. von pySerial. Falls du nicht festgelegt in der Wahl der Programmiersprache bist, möchtes du dir das vielleicht mal anschauen. Ansonsten bin ich mir sicher, dass sich im Laufe des Tages nochmal der ein oder andere Experte auf diesem Gebiet melden wird, der dir einen konkreten Vorschlag machen kann.

Antworten |