Системный вызов использует регистры или стек для передачи параметров ядру?
У меня есть путаница с системным вызовом. В X86 системный вызов использует eax для передачи номера системного вызова ядру.
Но что он использует для передачи параметров ядру, в каком-то месте я вижу, что он использует стек, и в нескольких местах он говорит, что он использует регистры EBX, ECX и т. д.
Так может ли кто-нибудь подтвердить, какой из них правильный ?
Передняя ссылка : эта Ссылка говорит, что она использует стек.
И эта Ссылка говорит, что она использует регистры.
2 ответа:
Обе ссылки говорят, что параметры передаются через регистры, такие как EBX, ECX и т. д. В пространство ядра из пространства пользователя.
На первой справочной странице : 35/352, реализация системного вызова / обертки задачи 1-й пункт, дано, что
Параметры, доступные в пользовательском стеке, перемещаются в регистры процессора, а затем эти регистры используются для передачи параметров syscall в пространство ядра.
Я думаю вы должны быть смущены, увидев стек слов на странице реализации системного вызова 1-й ссылки.
Обе ссылки верны.
Вы можете видеть, что все системные вызовы объявляются с префиксом asmlinkage. При определении системного вызова с помощью макроса SYSCALL_DEFINEx он определяет функцию системного вызова с помощью директивы asmlinkage. директива asmlinkage указывает компилятору, что функция не должна ожидать каких-либо параметров от регистров процессора, т. е. все параметры должны быть доступны только из стека.
При вызове из пользовательского пространства каждый параметр передается в процессор. регистры, во время перехода пользователя к ядру, ядро должно сохранить все регистры в стек (чтобы восстановить среду перед возвращением в пространство пользователя) при обработке запросов системных вызовов из пространства пользователя, так что после этого параметры доступны в стеке для функции системного вызова пространства ядра.