2012-05-14 6 views
7

Ich wollte den Code zum Ausführen von Systemaufrufen in Glibc überprüfen. Ich habe so etwas gefunden.Ist syscall eine Anweisung auf x86_64?

ENTRY (syscall) 
    movq %rdi, %rax  /* Syscall number -> rax. */ 
    movq %rsi, %rdi  /* shift arg1 - arg5. */ 
    movq %rdx, %rsi 
    movq %rcx, %rdx 
    movq %r8, %r10 
    movq %r9, %r8 
    movq 8(%rsp),%r9 /* arg6 is on the stack. */ 
    syscall   /* Do the system call. */ 
    cmpq $-4095, %rax /* Check %rax for error. */ 
    jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ 
L(pseudo_end): 
    ret   /* Return to caller. */ 

Jetzt ist meine Frage, ob die syscall (vor dem cmpq-Befehl) ist ein Befehl? Zweitens, wenn es eine Anweisung ist, was bedeutet ENTRY (syscall)? Der gleiche Name für einen Eintrag (ich weiß nicht, was ein Eintrag ist) und Anleitung? Zweitens, was ist L (pseudo_end)?

+0

Es ist. Es tut dasselbe wie 'int 0x80' in x86. – Dave

+0

Beachten Sie, dass normalerweise für jeden Systemaufruf spezialisierter Code verwendet wird, um '% rax' von einer Konstanten (Speichern eines Registers) zu setzen und nicht verwendete Argumente zu überspringen. – o11c

Antwort

3

Ja, syscall ist eine Anweisung auf x86-64. Es gibt eine ähnliche Anweisung sysenter auf i686.

ENTRY(syscall) wäre ein Makro. Vermutlich erweitert sich die Symboldefinition, dafür musst du grep.

7

syscall ist eine Anweisung in x86-64 und wird als Teil der ABI for making system calls verwendet. (Der 32-Bit-ABI verwendet int 80h oder sysenter und ist auch im 64-Bit-Modus verfügbar, aber die Verwendung des 32-Bit-ABI aus 64-Bit-Code ist insbesondere bei Aufrufen mit Zeigerargumenten eine schlechte Idee.)

Aber es gibt auch einen C library function named syscall(2), einen generischen Wrapper für den Systemaufruf ABI. Ihr Code zeigt den Speicherauszug dieser Funktion, einschließlich der Decodierung des Rückgabewertes in errno-setting. ENTRY(syscall) bedeutet nur, dass die Funktion dort beginnt.

L() und ENTRY() sind CPP-Makros.

L(pseudo_end) ist nur ein Label, das ein Sprungziel sein kann. Vielleicht springt der Code bei SYSCALL_ERROR_LABEL zurück dorthin, obwohl es für diesen Block des Codes effizienter wäre, nur ret, also vielleicht ist es ein Relikt von einer früheren Version, oder für etwas anderes verwendet.

+1

Wenn dies eine tatsächliche Anweisung ist, was ist ihr Opcode? – SasQ

+1

Es ist 0x0F 0x05 (schauen Sie sich das Software-Entwicklerhandbuch von Intel an). – flolo