PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Inline-Assembler, Linux, x86: Interrupt aufrufen



Saski
26-05-2005, 01:41
Huhu! :)

Ich hoffe, ihr könnt mir helfen. Ich muss unter Linux Interrupt 15 aufrufen, in AH soll dabei 0xC0 stehen. Das Ergebnis des Interrupts befindet sich dann in AX.

Durch diverse Inline-Assembler-Tutorials bin ich zu folgendem Gewurschtel gekommen:


long accu;

__asm__ ("int $0x15" : "=a" (accu) : "0" (0x00C0));
printf("EAX: %Xl\n", accu);

Doch leider stürzt das Programm beim Aufruf mit einem Segfault (selbst als root mit sudo) ab. :eek: Der Code ist eigentlich für einen IBM PS/2 gedacht, bei dem würde man auf diese Weise die Modell- und Submodellnummer herausbekommen, und könnte so die Hardware des Systems relativ exakt bestimmen. Es wird wohl so sein, dass mein PC-Kompatibler (auf dem ich kompiliere) bei diesem Interrupt garnix oder was total Anderes macht. Aber er könnte mir doch wenigstens den Inhalt des Akkus zurückgeben, oder? Kann mir bitte Jemand weiterhelfen? :confused:

LG,
Saskia :p

7.e.Q
26-05-2005, 06:46
Wenn er beim Ausführen des Interrupts bereits mit dem SegF aussteigt, kann er das printf auch nicht mehr ausführen.

Und es wird daran liegen, daß du versuchst, den Interrupt auf einem nicht dafür vorgesehenen System ausführst.

Was würde denn der Interrupt 0x15 mit AH=0xC0 auf deinem PC-kompatiblen System bewirken? Ich würd mich da mal schlau machen, ob es den selben Effekt haben müsste, wie auf deiner Ziel-Architektur.

Eventuell, was mich noch stutzig gemacht hat... willst du den Interrupt 15 (dezimal) oder den Interrupt 0x15 (hex, = 21 dezimal) ausführen?

Saski
26-05-2005, 13:29
Nachtrag 2: Ich hab grad gesehen, dass man diese Informationen auch über den Kernel bzw. /proc auslesen kann! Damit hätte sich Alles erledigt :D
---
Danke für die schnelle Antwort!

Es ist tatsächlich Interrupt 0x15, nicht 21. Entschuldige ;)

Also laut http://www.delorie.com/djgpp/doc/rbinter/id/02/16.html hätte das wohl in Etwa die selbe Wirkung, wie auf einem PS/2 :( Aber da kann man nachlesen, dass da noch andere Register geändert werden. Hat das etwas damit zu tun?

Nachtrag: Scheint so, als hätte Linux was gegen Int 0x15:
http://lists.emji.net/pipermail/wd_general/2003-April/000298.html
Ich brauch ihn aber! :(

bargol
14-09-2005, 20:53
Hallo allerseits,

habe das gleiche Problem das ich ein int 0x15 unter Linux machen muss.
Ist da eine Lösung vorhanden?

Gruss,

bargol

Joghurt
17-09-2005, 01:19
Eine Entsprechende Kernel-funktion benutzen, oder im /proc Verzeichnis nachsehen.

Interrupt wie 15h stammen noch aus DOS/BIOS-Zeiten und können mit dem Protected Mode nicht umgehen.