Wie nennt man die Aufrufkonvention hinter „int 0x80“?

Wie nennt man die Aufrufkonvention hinter „int 0x80“?

Ich weiß, dass es eine Konvention gibt syscall, aber wie nennt man die Aufrufkonvention, die davor steht und die Sie sehen, wenn Sie „an“ int 80statt „ aufrufen“ syscall, so wie hier.

mov  rax,4     ; system call number (sys_write)
mov  rbx,1     ; file descriptor (stdout)
mov  rcx,hello ; message to write
mov  rdx,12    ; message length
int  0x80      ; call kernel

ich leseHierdass die Argumente danach , , (oder für x64 , , ) rdxsind , sehe ich es nicht dokumentiert inesiediebprsirdirbpWikipedia-Seite zu Aufrufkonventionen, Aberint80hscheint darauf hinzudeuten, dass auch Windows diese Konvention verwendet?

Wie lautet der konventionelle Name dafür? Wo in der Linux-Kernel-Quelle kann ich es definiert sehen? Und wo ist die Tabelle, die in die Prozeduren aufgelöst wird, wenn raxSie aufrufen int 0x80? Für istsyscallsys_writerax=1

Antwort1

Ihre Frage deckt mehrere Themen ab. Ich werde versuchen, auf alle einzugehen.

  1. Ich bin mir nicht sicher, ob es einen einzigen, kanonischen Begriff für die Art und Weise gibt, wie Systemaufrufe aufgerufen werden, und noch weniger für eine bestimmte Art und Weise, wie Systemaufrufe aufgerufen werden (Interrupt 0x80 im Gegensatz zu SYSENTERoder SYSCALL). Auf x86-64 ist derdokumentiertDie Systemaufrufschnittstelle mit SYSCALLwird im System V x86-64 ABI beschrieben, aber das ist nur informativ und nicht normativ. Auch wenn die meisten Leute verstehen würden, was Sie meinen, wenn Sie es als „i386 Linux-Kernel-ABI“ bezeichnen würden (ersetzen Sie „i386“ durch die Architektur, von der Sie sprechen), könnte das ebenfalls verwirrend sein, da „Kernel-ABI“ eine andere Bedeutung hat (im Kontext von Kernelmodulen) und dies wiederum nicht auf Interrupt 0x80 beschränkt ist.

    In der Praxis sollten sich die meisten Leute ohnehin nicht um die Einzelheiten bis zu dieser Detailebene kümmern, insbesondere, da sie sich weiterentwickeln können: Interrupt 0x80 SYSCALLusw., wie Sie erwähnen, aber auch der vDSO, der seine eigenen Feinheiten mit sich bringt und heutzutage der bevorzugte Einstiegspunkt für alle Systemaufrufe auf x86 ist ... Das heißt natürlich nicht, dass es keinen Begriff geben kann, der sich auf eine bestimmte Aufrufkonvention bezieht, aber ich bin nicht sicher, ob das so nützlich wäre.

  2. Windows unterstützt auch die Verwendung eines Interrupts für seine Systemaufrufschnittstelle 0x2E, aber seine „Aufrufkonvention“ istganz anders: Argumente werden auf den Stapel gelegt, der angeforderte Systemaufruf wird von EAX gegeben und EBX zeigt auf die Argumente auf dem Stapel.

  3. Aktuelle x86-Kernel definieren die Systemaufrufschnittstelle inarch/x86/entry:entry_32.Senthält die i386-Schnittstelle,entry_64.Sdie x86-32- und x86-64-Schnittstelle,entry_64_compat.Sdie 32-Bit x86-64-Schnittstelle (für Abwärtskompatibilität),syscalls/syscall_32.tbldie i386-Systemaufruftabelle,syscalls/syscall_64.tbldie x86-32- und x86-64-Systemaufruftabelle.

    Die Kommentare in diesen Dateien dokumentieren die Schnittstelle, insbesondere wie Argumente übergeben werden: Für 32-Bit-Aufrufe enthält EAX die Systemaufrufnummer und seine Parameter werden in EBX, ECX, EDX, ESI, EDI und EBP abgelegt (der Parameter selbst für SYSENTER, ein Zeiger auf den Benutzerstapel, der den Parameter für den Interrupt 0x80 enthält); für 64-Bit-Aufrufe enthält RAX die Systemaufrufnummer und seine Parameter werden in RDI, RSI, RDX, R10, R8 und R9 abgelegt (siehe auchWarum wurden die Systemaufrufregister und -reihenfolge von Intel 32 Bit auf 64 Bit geändert?). Eine schöne Zusammenfassung mit Diagrammen gibt es incalling.h.

Als Randbemerkung sei erwähnt, dass historische Vergleiche häufig auf die MS-DOS-Anrufschnittstelle verweisen, die hauptsächlichUnterbrechung 0x21; es enthielt auch den Multiplex-Interrupt,Version:, dieein erweiterbarer Mechanismuszum Hinzufügen von Systemdiensten (normalerweise unter Einbeziehung von TSRs; Gerätetreiber verwendeten meist eine andere Schnittstelle).

verwandte Informationen