Как системный вызов знает, куда функция-обертка помещает свои параметры? - PullRequest
3 голосов
/ 23 марта 2010

Я пытаюсь реализовать системный вызов в Linux (RedHat Enterprise 8), и я немного озадачен тем, как он работает. Насколько я понимаю, я реализую оболочку в пользовательском режиме, которая помещает номер системного вызова в eax и параметры в ebx, ecx, edx и т. Д., А затем вызывает int 0x80, который вызывает соответствующий системный вызов. Мой вопрос таков: поскольку системный вызов написан как обычная функция C, как он узнает, какие регистры содержат какие параметры? Это соглашение или есть механизм для него, и если да, то где и как оно это делает?

РЕДАКТИРОВАТЬ: Это домашнее задание. Я знаю, что есть макросы syscall, которые могут сделать это для меня.

1 Ответ

4 голосов
/ 23 марта 2010

Из статьи Linux Journal , внизу страницы 2

Поскольку интерфейс системного вызова исключительно параметризован регистром, максимум шесть параметров можно использовать с одним системным вызовом. % eax - номер системного вызова; % ebx,% ecx,% edx,% esi,% edi и% ebp - это шесть общих регистров, используемых в качестве param0-5; и% esp нельзя использовать, потому что он перезаписывается ядром при входе в кольцо 0 (т. е. режим ядра).

Ваш код на c может выглядеть так, как будто он выполняет системный вызов, но на самом деле он вызывает функцию в libc. Эта функция гарантирует, что все аргументы находятся в правильных регистрах, а затем выполняет прерывание.

...