В Linux, при вводе вызова sys, каково значение в %eax? (не ориг еах)

когда syscall возвращается, я получаю возвращаемое значение syscall в %eax, однако при входе я получаю -38, который является 0xFFFFFFDA в hex. Это как для записи/чтения. Что это за номер? Может ли он использоваться для безопасного различения входа и выхода?

2 ответов


-38 в eax на записи syscall, по-видимому, ENOSYS (функция не реализована) и помещается туда syscall_trace_entry в arch/x86/kernel/entry_32.S. Я полагаю, можно с уверенностью предположить, что он всегда будет там на входе syscall, однако Он также может быть там на выходе syscall, Если syscall возвращает ENOSYS.

лично я всегда просто отслеживал, нахожусь ли я в syscall entry или exit при использовании ptrace, хотя я видел некоторый код, полагающийся на Слишком ENOSYS. (Я предполагаю, что вы используете ptrace) я думаю, что это не сработает, если процесс окажется внутри syscall, когда вы присоединитесь к нему, но мне повезло, что я не столкнулся с этой проблемой.

Я быстро взглянул на источники strace, и я думаю, что он также отслеживает состояние, так как был комментарий, говорящий: "мы прикрепляемся к уже запущенному процессу. Попробуйте выяснить состояние процесса в syscalls, чтобы хорошо обработать первое событие.- а чуть позже ... сказал: "Процесс спит в середине syscall. Подделка события входа syscall.".

короче говоря, значение не может быть безопасно использовано для различения входа и выхода. Тем не менее, я не уверен, что отслеживание его вручную-лучший метод, так как у меня на самом деле нет источника, который определенно сказал бы вам использовать эту технику, извините. :)


Я все еще не получаю, когда вы получаете -38 в eax, но при выполнении syscall eax содержит число, которое определяет syscall (в ядре 2.6 вы можете посмотреть на arch/x86/include/asm/unistd_64.h, чтобы увидеть номера для каждого вызова).

таким образом, последовательность следующая:

  1. ваша программа
  2. установите eax в syscall (dep по вызову, а также некоторые другие правила)
  3. init syscall (через int 0x80)
  4. результат syscall в eax
  5. ваш снова программы

возможно, ваш вопрос не так сформулирован, но если вы не пишете код/драйвер ядра, самый простой способ сказать, находитесь ли вы до входа syscall или после выхода syscall: TRUE, когда вы находитесь в своем коде ;-). Сам вход / выход происходит (более или менее) мгновенно в одной инструкции, поэтому либо вы находитесь в syscall (тогда вы знаете, потому что это должен быть какой-то код ядра или блокирующий вызов), либо нет (почти каждый раз, когда отладка кода).