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.
Soll die Anweisung syscall
nur auf der 64-Bit-Plattform verwendet werden? Verwendet 32 Bit Linux nicht syscall
?
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.
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 .
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?
Tags und Links assembly linux 32-bit system-calls sysenter