Системный вызов использует регистры или стек для передачи параметров ядру?


У меня есть путаница с системным вызовом. В X86 системный вызов использует eax для передачи номера системного вызова ядру.

Но что он использует для передачи параметров ядру, в каком-то месте я вижу, что он использует стек, и в нескольких местах он говорит, что он использует регистры EBX, ECX и т. д.

Так может ли кто-нибудь подтвердить, какой из них правильный ?

Передняя ссылка : эта Ссылка говорит, что она использует стек.

И эта Ссылка говорит, что она использует регистры.

2 3

2 ответа:

Обе ссылки говорят, что параметры передаются через регистры, такие как EBX, ECX и т. д. В пространство ядра из пространства пользователя.

На первой справочной странице : 35/352, реализация системного вызова / обертки задачи 1-й пункт, дано, что

Параметры, доступные в пользовательском стеке, перемещаются в регистры процессора, а затем эти регистры используются для передачи параметров syscall в пространство ядра.

Я думаю вы должны быть смущены, увидев стек слов на странице реализации системного вызова 1-й ссылки.

Обе ссылки верны.

Вы можете видеть, что все системные вызовы объявляются с префиксом asmlinkage. При определении системного вызова с помощью макроса SYSCALL_DEFINEx он определяет функцию системного вызова с помощью директивы asmlinkage. директива asmlinkage указывает компилятору, что функция не должна ожидать каких-либо параметров от регистров процессора, т. е. все параметры должны быть доступны только из стека.

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