2012-05-14 18 views
7

Volevo controllare il codice per eseguire chiamate di sistema in glibc. Ho trovato qualcosa di simile.È syscall un'istruzione su 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. */ 

Ora la mia domanda è se la syscall (prima dell'istruzione cmpq) è un'istruzione? In secondo luogo, se si tratta di un'istruzione, qual è il significato di ENTRY (syscall)? Lo stesso nome per un'ENTRATA (non so cos'è un'immissione) e istruzioni? In secondo luogo, cos'è L (pseudo_end)?

+0

Lo è. Fa lo stesso di 'int 0x80' in x86. – Dave

+0

Si noti che per ogni chiamata di sistema viene utilizzato un codice normalmente specializzato, per impostare '% rax' da una costante (salvando un registro) e per saltare l'impostazione degli argomenti non utilizzati. – o11c

risposta

3

Sì, syscall è un'istruzione su x86-64. C'è un'istruzione simile sysenter su i686.

ENTRY(syscall) sarebbe una macro. Probabilmente si espande fino alla definizione del simbolo, per questo bisognerebbe.

7

syscall è un'istruzione in x86-64 e viene utilizzato come parte dello ABI for making system calls. (L'ABI a 32 bit utilizza int 80h o ed è anche disponibile in modalità a 64 bit, ma l'utilizzo dell'ABI a 32 bit dal codice a 64 bit è una cattiva idea, soprattutto per le chiamate con argomenti del puntatore.)

Ma c'è anche un C library function named syscall(2), un wrapper generico per la chiamata di sistema ABI. Il tuo codice mostra il dump di quella funzione, compresa la sua decodifica del valore di ritorno in errno -impostazione. ENTRY(syscall) significa solo che la funzione inizia da lì.

L() e ENTRY() sono macro CPP.

L(pseudo_end) è solo un'etichetta che può essere un obiettivo di salto. Forse il codice a SYSCALL_ERROR_LABEL torna a questo punto, anche se sarebbe più efficiente per quel blocco di codice a solo ret, quindi forse è una reliquia di una versione precedente o usata per qualcos'altro.

+1

Se si tratta di un'istruzione effettiva, qual è il suo codice operativo? – SasQ

+1

È 0x0F 0x05 (basta guardare il manuale dello sviluppatore software di Intel). – flolo