syscall
ist die Standardmethode zum Aufrufen des Kernelmodus unterx86-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 ähneltsyscall
, allerdings etwas schwieriger zu benutzen, aber das ist Sache des Kernels.int 0x80
ist eine veraltete Methode zum Aufrufen eines Systemaufrufs und sollte vermieden werden.
Die bevorzugte Methode zum Aufrufen eines Systemaufrufs ist die Verwendung von vDSO, einem Teil des Speichers, der in jedem Prozessadressraum abgebildet ist und eine effizientere Nutzung von Systemaufrufen ermöglicht (z. B. indem in einigen Fällen überhaupt nicht in den Kernelmodus gewechselt wird). vDSO bewältigt auch schwierigere, im Vergleich zum alten int 0x80
Umgang mit syscall
oder sysenter
Anweisungen.
Siehe auch dies und das.
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). Sie sollten also das VDSO verwenden, und Sie verwenden für bestehende Systemaufrufe besser die von der libc bereitgestellte Schnittstelle.
Beachten Sie, dass AFAIK, ein erheblicher Teil der Kosten für einfache Systemaufrufe vom Benutzerbereich zum Kernel und zurück geht. Daher ist für einige Systemaufrufe (wahrscheinlich gettimeofday
, getpid
...) könnte der VDSO sogar das vermeiden (und technisch gesehen einen echten Syscall vermeiden). Für die meisten Systemaufrufe (wie open
, read
, send
, mmap
....) die Kernel-Kosten des Systemaufrufs groß genug sind, um den Übergang vom Benutzerbereich zum Kernelbereich zu verbessern (z. B. mit SYSENTER
). oder SYSCALL
Maschinenanweisungen statt INT
) unbedeutend.
Beachten Sie dies vor dem Ändern:Systemrufnummern unterscheiden sich bei 0x80 oder Syscall ist z. B. sys_write 4 bei 0x80 und 1 bei Syscall.
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html für 32 Bit oder 0x80http://blog.rchapman.org/post/36801038863/linux-system-call-table-for -x86-64 für Systemaufruf