2012-05-14 2 views
7

Я хотел проверить код для выполнения системных вызовов в glibc. Я нашел что-то вроде этого.Является ли syscall инструкцией по 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. */ 

Теперь мой вопрос, если системный вызов (до cmpq инструкции) является инструкцией? Во-вторых, если это инструкция, в чем смысл ENTRY (syscall)? Одно и то же имя для входа (я не знаю, что такое ENTRY) и инструкции? Во-вторых, что такое L (pseudo_end)?

+0

Это так. Он делает то же самое, что и 'int 0x80' в x86. – Dave

+0

Обратите внимание, что для каждого системного вызова обычно используется специализированный код, чтобы установить '% rax' из константы (сохранение регистра) и пропустить настройку неиспользуемых аргументов. – o11c

ответ

3

Да, syscall является инструкцией по x86-64. Существует аналогичная инструкция sysenter на i686.

ENTRY(syscall) будет макросом. Вероятно, он расширяется до определения символа, для этого вам нужно grep.

7

syscall является инструкцией по x86-64 и используется как часть ABI for making system calls. (32-битный ABI использует int 80h или sysenter, а также доступен в 64-битном режиме, но с использованием 32-битного ABI из 64-битного кода это плохая идея, особенно для вызовов с аргументами указателями.)

Но есть и C library function named syscall(2), общий обертка для системного вызова ABI. В вашем коде отображается дамп этой функции, включая ее декодирование возвращаемого значения в errno -setting. ENTRY(syscall) просто означает, что функция начинается там.

L() и ENTRY() являются макросами CPP.

L(pseudo_end) - это просто ярлык, который может стать целью перехода. Может быть, код на SYSCALL_ERROR_LABEL возвращается туда, хотя для этого блока кода было бы более эффективным только ret, так что, возможно, это реликвия из прежней версии или используется для чего-то еще.

+1

Если это действительная инструкция, каков ее код операции? – SasQ

+1

Это 0x0F 0x05 (просто посмотрите руководство по разработке программного обеспечения от Intel). – flolo

 Смежные вопросы

  • Нет связанных вопросов^_^