Это зависит от архитектуры, для которой вы хотите добавить системный вызов, или если вы хотите добавить системный вызов для всех архитектур. Я объясню один способ добавить системный вызов для ARM.
- Выберите название для вашей системы. Например,
mysyscall
.
Выберите номер системного вызова. В arch/arm/include/asm/unistd.h
обратите внимание на то, как назначается ему каждый столбец с заданным номером (__NR__SYSCALL_BASE+<number>
). Выберите неиспользуемый номер для вашего системного вызова. Выберем число системных вызовов 223. Затем добавить:
#define __NR_mysyscall (__NR_SYSCALL_BASE+223
где индекс 223 будет в этом файле заголовка. Это присваивает номер 223 вашему Syscall на ARM-архитектурах.
Изменить архитектуры системного вызова таблица. В linux/arch/arm/kernel/calls.S
, измените строку, которая соответствует SYSCALL 223 к:
CALL(sys_mysyscall)
Добавьте свой прототип функции. Предположим, вы хотели добавить нестандартный сценарий. Редактирование файла: include/linux/syscalls.h
и добавить прототип вашего SYSCALL в:
asmlinkage long sys_mysyscall(struct dummy_struct *buf);
Если вы хотите, чтобы добавить его специально для ARM, то выполните следующие действия, за исключением в этом файле: arch/arm/kernel/sys_arm.c
.
Внесите свой syscall где-нибудь. Создайте файл, пожалуйста. Например, в каталоге kernel/
. Вы должны иметь по крайней мере:
#include <linux/syscalls.h>
...
SYSCALL_DEFINE1(mysyscall, struct dummy_struct __user *, buf)
{
/* Implement your syscall */
}
Обратите внимание на макро, SYSCALL_DEFINE1
. Номер в конце должен соответствовать количеству входных параметров, которые имеет ваш syscall. В этом случае наш системный вызов имеет только один параметр, поэтому вы используете SYSCALL_DEFINE1
. Если у него было два параметра, вы использовали бы SYSCALL_DEFINE2
и т. Д.
Не забудьте добавить файл объекта (.o) в файл Makefile в каталог, в который вы его положили.
- Скомпилируйте свое новое ядро и тест. Вы не изменили свои библиотеки C, поэтому вы не можете вызывать свой системный вызов с
mysyscall()
.Вы должны использовать функцию syscall()
которая принимает номер системного вызова в качестве первого аргумента:
struct dummy_struct *buf = calloc(1, sizeof(buf));
int res = syscall(223, buf);
Обратите внимание, что это было для ARM. Этот процесс будет очень похож на другие архитектуры.
Edit: Не забудьте добавить свой файл системного вызова в Makefile в ядре /.
Привет, У меня есть аналогичный вопрос в OS X, посвященный конкретному сценарию, который уже реализован в ядре. однако реализация и вызов кажутся разными в входных аргументах. возможно, вы можете посмотреть здесь: http://stackoverflow.com/questions/37656016/osx-setgid-system-call-which-api-is-the-correct-one – Zohar81