GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist besser int 0x80 oder syscall in 32-Bit-Code unter Linux?

  • syscall ist die Standardmethode zum Aufrufen des Kernelmodus unter 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 ähnelt syscall , 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


Linux
  1. Was macht einen Kernel-Linux-Server grundlegend?

  2. Was bedeutet es zu sagen, dass der Linux-Kernel präventiv ist?

  3. Was bedeutet __init im Linux-Kernel-Code?

  4. Was bedeutet EXPORT_SYMBOL im Linux-Kernel-Code?

  5. Wie kodiere ich ein Linux-Kernel-Modul?

Was tun bei einer Linux-Kernel-Panik?

Wie lade ich Linux-Kernel-Module aus C-Code?

Der Adressraum des 32-Bit-Prozesses unter 64-Bit-Linux

Was ist die aktuelle Linux-Kernelquelle?

Was sind High Memory und Low Memory unter Linux?

Anforderungen für die Portierung von Linux auf eine andere Plattform