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/ |