Syscall oder sysenter auf 32 bit Linux?

8

Seit MS-DOS kenne ich den Systemaufruf mit Interrupts. In alten Papieren sah ich einen Verweis auf int 80h , um Systemfunktionen unter Linux aufzurufen. Seit einiger Zeit weiß ich, dass int 80h zugunsten der Anweisung syscall veraltet ist. Aber ich kann es nicht auf meiner 32-Bit-Maschine arbeiten.

Die Frage

Soll die Anweisung syscall nur auf der 64-Bit-Plattform verwendet werden? Verwendet 32 ​​Bit Linux nicht syscall ?

Ein Beispieltest

Auf meinem 32-Bit-Linux (Ubuntu Precise) endet dieses Programm mit einem Core-Dump:

%Vor%

Ich habe versucht mit sysenter anstelle von syscall , aber es stürzt auf die gleiche Weise ab.

    
Hibou57 24.03.2013, 12:54
quelle

2 Antworten

5

Nach einiger Websuche bin ich zu diesem anderen Thema auf StackOverflow gelandet: Linux ruft einen Systemaufruf über das sesenter-Tutorial auf . Es besagt, dass die empfohlene Methode zum Aufrufen des Systems weder int 80h noch syscall noch sysenter , sondern linux-gate.so verwendet.

Bleibt immer noch die Frage nach dem Absturz und Core-Dump. Meine Vermutung ist schließlich, dass, obwohl entweder syscall oder sysenter Anweisungen als CPU-Anweisung verfügbar sind, der Linux-Kernel diesen "Einstiegspunkt" nicht richtig einrichten kann, wenn er entscheidet, dass er auf einer bestimmten Hardware nicht wirklich nützlich ist Plattform.

Scheint auf 32-Bit-Plattform, sysenter oder syscall kann verfügbar sein, während es immer verfügbar ist, nur auf 64-Bit-Plattform.

Obwohl ich diese Antwort meine Frage fühle, begrüße ich immer noch mehr Material, wie eine verbindliche Referenz für meine obige Vermutung.

- Aktualisierung -

Zumindest konnte ich das finden, das das oben genannte bestätigt. Das ist immer noch keine verbindliche Referenz, scheint aber vertrauenswürdig genug, glaube ich.

Was ist linux-gate.so.1? , sagt:

  

Die bevorzugte Methode zum Aufrufen eines Systemaufrufs ist    vom Kernel beim Booten festgelegt und   offensichtlich verwendet diese Box sysenter.

Auch von einer anderen Quelle, einer Beispiel-FASM-Assembly-Quelle (benötigt einige Übersetzungen, wenn Sie NASM verwenden), um eine Systemfunktion über linux-gate.so aufzurufen: Finden von linux-gate.so.1 in Assembly .

    
Hibou57 24.03.2013, 15:44
quelle
5

Der Intel-Handbuch sagt, dass syscall im Kompatibilitätsmodus (32-Bit) ungültig ist, daher sollte es nicht vom Kernel verwendet werden.

Dies scheint jedoch eine Beschränkung nur für Intel zu sein: Ссылка , die AMD nicht hat, aber sicherlich Linux Unterstützung von Intel: -)

sysenter scheint der beste Weg zu sein, um es heute zu tun, da es schneller ist als int 0x80 , aber es sollte indirekt über VDSO verwendet werden, wie in Wie ein Systemaufruf über sysenter in Inline-Assembly (x86 / AMD64 Linux) aufrufen?

    
quelle