it-swarm.com.de

Was ist besser "int 0x80" oder "syscall"?

Ich habe den Linux-Kernel studiert und herausgefunden, dass für x86_64 Architektur der Interrupt int 0x80 funktioniert nicht als Systemaufruf.

Die Frage ist: im Falle von x86 Architektur was ist besser syscall oder int 0x80 und warum?

EDIT : Ich benutze den Kernel 3.4

56
Alex
  • syscall ist die Standardmethode zum Aufrufen des Kernel-Modus auf x86-64. Diese Anweisung ist in 32-Bit-Betriebsmodi auf Intel-Prozessoren nicht verfügbar.
  • sysenter ist eine Anweisung, die am häufigsten zum Aufrufen von Systemaufrufen in 32-Bit-Betriebsmodi verwendet wird. Es ist ähnlich wie syscall, allerdings etwas schwieriger zu benutzen, aber das ist das Problem des Kernels.
  • int 0x80 ist eine traditionelle Methode zum Aufrufen eines Systemaufrufs und sollte vermieden werden.

Die bevorzugte Methode zum Aufrufen eines Systemaufrufs ist die Verwendung von VDSO, einem Teil des in jedem Prozessadressraum zugeordneten Speichers, der eine effizientere Verwendung von Systemaufrufen ermöglicht (z. B. indem in einigen Fällen der Kernelmodus überhaupt nicht aufgerufen wird). VDSO kümmert sich auch schwieriger, im Vergleich zum Erbe int 0x80 Weg, Umgang mit syscall oder sysenter Anweisungen.

Siehe auch this und this .

73
Paweł Dziepak

Meine Antwort hier deckt Ihre Frage ab.

In der Praxis implementieren neuere Kernel ein VDSO , insbesondere um Systemaufrufe dynamisch zu optimieren (der Kernel setzt das VDSO auf einen Code, der für den aktuellen Prozessor am besten geeignet ist). Verwenden Sie daher VDSO und für vorhandene Systemaufrufe besser die von libc bereitgestellte Schnittstelle.

Beachten Sie, dass nach AFAIK ein erheblicher Teil der Kosten für einfache Systemaufrufe vom Benutzerbereich zum Kernel und zurück fließt. Daher könnte das VDSO für einige Systemaufrufe (wahrscheinlich gettimeofday, getpid ...) sogar dies vermeiden (und technisch möglicherweise einen echten Systemaufruf vermeiden). Für die meisten Systemaufrufe (wie open, read, send, mmap ....) sind die Kernelkosten des Systemaufrufs groß genug, um Verbesserungen vorzunehmen des Übergangs vom User-Space zum Kernel-Space (z. B. mit SYSENTER oder SYSCALL Maschinenbefehlen anstelle von INT) unbedeutend.

19

Beachten Sie dies, bevor Sie Folgendes ändern: Systemrufnummern unterscheiden sich , wenn Sie 0x80 oder syscall ausführen, z. B. ist sys_write 4 mit 0x80 und 1 mit syscall.

http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html für 32 Bit oder 0x80 http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64 for syscall

7
Thomas