sys_read syscall против int 0x80 в GNU Assembler
Я пытаюсь написать простую программу, которая получает несколько символов из стандартного ввода. Для краткости соответствующий код:
mov $3, %rax # sys_read = 3
mov $0, %rbx # stdin fd = 0
mov $b, %rcx # '.lcomm b, 32' declared in .bss section
mov $32,%rdx # size_t
# syscall
int $0x80
Когда я использую int $0x80
программа функционирует как задумано, однако с syscall
это segfaults. Я читал, что это как-то связано с тем, что использование прерывания требует от ядра запоминания состояния машины, в то время как syscall
не выполняет это требование, то есть ядро обрабатывает его в свое время. Я не уверен, что это настоящая причина - я бы предположил, что syscall
что-то делает с регистрами, чтобы sys_read
выходит из строя.
Я также прочитал из предыдущего вопроса, размещенного здесь, что "syscall
это способ входа в ядро по умолчанию "и это"int 0x80
является устаревшим способом вызова системного вызова, и его следует избегать." ( Ссылка)
Я не могу найти какую-либо хорошую документацию по этому вопросу, поэтому любые отзывы будут оценены.
Редактировать: опечатка
1 ответ
Проверьте этот вопрос. На x86_64 правильный системный вызов выхода $60
который должен быть в %rax
,
mov $60, %rax
mov $0, %rdi
syscall