OSDev
http://osdev.su/

Си - системные вызовы
http://osdev.su/viewtopic.php?f=6&t=332
Страница 1 из 1

Автор:  KIV [ 24 авг 2010, 13:44 ]
Заголовок сообщения:  Си - системные вызовы

Взялся я переписать свою операционку на Си вместо асма. Дошёл до системных вызывов и тут не знаю как сделать.
Как вызывать системный вызов из пользовательского приложения? Я хочу написать макрос. Дело в том, что если 64 бита, то использовать можно лишь fastcall. И никаких ccall и stdcall. Соответственно и syscall надо передавать по соглашению fastcall. Но не хотелось бы ручками запихивать параметры в регистры. А можно как-нибудь сделать, что параметры в стек/регистры запихнулись как при вызове обычной функции, но вместо call abc было syscall?
Дело в том, что в качестве обработчика syscall у меня стоит:
Код:
syscall_entry:
        cmp rax, syscall_max
   jae .error
   mov rax, [qword syscall_table + rax * 8]
   call rax
   sysretq
.error:
   mov rax, -1
   sysretq

Где syscall_table это символ из модуля на Си. Макрос системного вызова должен делать следующее:
1. Запихнуть все параметры в регистры/стек
2. Поместить в rax номер системного вызова
3. Выполнить syscall

Автор:  Himik [ 25 авг 2010, 15:42 ]
Заголовок сообщения:  Re: Си - системные вызовы

Надо объявить промежуточную процедуру, через которую приложение будет вызывать ядро. Примерно так:
Код:
void KivCallParam1(__int64 InputParam, __int64* OutValue)
{
    __asm {
    syscall ... // Вызов ядра. Параметры уже содержатся в регистрах.
    mov [OutValue], rax // Запись результата.
    }
}

Только надо несколько таких процедур с разным количеством параметров. Или подсмотри в Linux.

Автор:  KIV [ 25 авг 2010, 18:24 ]
Заголовок сообщения:  Re: Си - системные вызовы

Меня лишь смущает то, что будет сохранён адрес возврата в стеке. А ведь если параметров больше 6 (по Linux соглашению. по Windows больше 4), то их придёться пихать в стек. А там будет два адреса возврата (один из user mode, другой из kernel mode) и все параметры будут смещены. Хотелось бы обойтись без адреса возврата, который пихает в стек процедура user mode. Кстати, а зачем перемещать результат из rax в переменную? Ведь функции Си и так возвращают результат в RAX. Удобнее пользоваться функциями, которые объявлены как функции, а не как процедуры.

Автор:  Himik [ 26 авг 2010, 19:15 ]
Заголовок сообщения:  Re: Си - системные вызовы

KIV, ты правильно понял, что эту процедуру надо оформить как встраиваемую функцию, и результат возвращать через регистр rax, только так она будет работать эффективно. Но как это делается в GCC я представления не имею. Могу только посоветовать подсмотерть Linux, дабы не изобретать велосипед.
В принципе, компилятор обычно делает процедуру встраиваемой, если она описана с атрибутом static.

Автор:  SII [ 28 авг 2010, 07:14 ]
Заголовок сообщения:  Re: Си - системные вызовы

Я б ещё посоветовал поэксперементировать с различными атрибутами и параметрами (по количеству и размеру параметров), и каждый раз смотреть, какой код генерится. Естественно, не забывая про ключи оптимизации, поскольку это тоже влияет. Ну и составить себе раз и навсегда справочник по передаче параметров в ГЦЦ.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/