OSDev

для всех
Текущее время: 24 июл 2019, 10:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Си - системные вызовы
СообщениеДобавлено: 24 авг 2010, 13:44 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Взялся я переписать свою операционку на Си вместо асма. Дошёл до системных вызывов и тут не знаю как сделать.
Как вызывать системный вызов из пользовательского приложения? Я хочу написать макрос. Дело в том, что если 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си - системные вызовы
СообщениеДобавлено: 25 авг 2010, 15:42 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си - системные вызовы
СообщениеДобавлено: 25 авг 2010, 18:24 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си - системные вызовы
СообщениеДобавлено: 26 авг 2010, 19:15 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1087
Откуда: Балаково
KIV, ты правильно понял, что эту процедуру надо оформить как встраиваемую функцию, и результат возвращать через регистр rax, только так она будет работать эффективно. Но как это делается в GCC я представления не имею. Могу только посоветовать подсмотерть Linux, дабы не изобретать велосипед.
В принципе, компилятор обычно делает процедуру встраиваемой, если она описана с атрибутом static.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Си - системные вызовы
СообщениеДобавлено: 28 авг 2010, 07:14 

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB