Системный вызов - это инструкция для x86_64?

Я хотел проверить код для выполнения системных вызовов в glibc. Я нашел что-то подобное.

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) инструкцией? Во-вторых, если это инструкция, что означает ВХОД (системный вызов)? Одно и то же имя для ЗАПИСИ (я не знаю, что такое ЗАПИСЬ) и инструкции? Во-вторых, что такое L (pseudo_end)?


person pythonic    schedule 14.05.2012    source источник
comment
Это. Он делает то же самое, что и int 0x80 в x86.   -  person Dave    schedule 14.05.2012
comment
Обратите внимание, что обычно специализированный код используется для каждого системного вызова, чтобы установить %rax из константы (сохранение регистра) и пропустить настройку неиспользуемых аргументов.   -  person o11c    schedule 31.08.2017


Ответы (2)


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

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

L() и ENTRY() - это макросы CPP.

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

person flolo    schedule 14.05.2012
comment
Если это настоящая инструкция, каков ее код операции? - person SasQ; 07.06.2015
comment
Это 0x0F 0x05 (просто посмотрите руководство разработчика программного обеспечения от Intel). - person flolo; 30.07.2015

Да syscall - это инструкция на x86-64. Есть аналогичная инструкция sysenter на i686.

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

person jpalecek    schedule 14.05.2012