Я беру курс ОС, и первым решением было добавить несколько системных вызовов в ядро (Redhat, версия ядра 2.4).Добавление нового системного вызова в ядро linux, похоже, не работает
Я добавил все, что, как я думал, должно быть добавлено, и оно по-прежнему не работает.
Я пытаюсь запустить тесты, и я заметил, что обертки (я добавил пример для одного ниже и код sys_call для него) не связаны с системными вызовами. Я знаю это, потому что я помещаю printk в системные вызовы, и они никогда не появляются (и сам тест не дает ожидаемого результата).
Теперь от того, что я понимаю процесс разработки для добавления системного вызова является:
- Создание оберток как функции примера обертки в инструкции (позволяет называть его AService ").
- Напишите sys_aservice в .c файле, который перейдет в один из многих файлов в папке linux-2.4.18-14. Файл, к которому он идет, зависит от типа службы, которую я хочу добавить (например, если это была служба файловой системы, которую я поставил бы в fs).
- Добавить запись для системного вызова в таблице на
/usr/src/linuxlinux-2.4.18-14custom/arch/i386/kernel/ entry.S
Это то, что я сделал в первый, но это, кажется, не достаточно (потому что это не похоже на работу).
Я искал его онлайн (и читал: How to add a system call), и я прочитал, что мне нужно добавить/изменить следующие вещи для привязки к работе.
Добавить строку в unistd.h для системного вызова. Это будет выглядеть как
определяют __NR_aservice
Добавить AService в Makefile. Так, например, если я поместил aservice.c в папку fs, я бы добавил aservice.c в makefile в fs.
Создайте файл aservice.h, который перейдет в linux-2.4.18-14custom/include/linux (где все h-файлы идут, по-видимому?). Этот файл .h будет включать в себя что-то, называемое «заглушкой», которое автоматически генерируется из макроса в unistd.h (который должен содержать файл .h), чтобы программа пользователя могла использовать ваш системный вызов. декларация заглушки выглядит следующим образом: _syscallN (тип возвращаемого значения, имя функции, тип arg1, arg1 имя ...)», где„N“является числом параметров
PREPEND каждой функции sys_X в aservice.c. ключевое слово «asmlinkage» (которое требует включения linkage.h). Таким образом, объявления функций выглядят так: asmlinkage int sys_aservice (...) {..} После этого добавьте файл .h в файл .c.
Все ли это правильно? Потому что даже после выполнения следующего кажется, что системный вызов не вызван.
Вот пример обертка и системный вызов реализации:
int stop_monitor(int pid){
long __res;
__asm__ volatile (
"movl $244, %%eax;" << 244 is the entry in the sys_call table in entry.S
"movl %1, %%ebx;"
"int $0x80;"
"movl %%eax, %0"
: "=m" (__res)
: "m" (pid)
: "%eax", "%ebx"
);
if((unsigned long)(__res) >= (unsigned long)(-125)) {
errno = -(__res);
__res = -1;
}
return (int)(__res);
}
asmlinkage int sys_stop_monitor(int pid){
task_t* task = find_task_by_pid(pid);
if(!task)
return -ESRCH;
if(task->flagMonitor == 0)
return -EPERM;
task->flagMonitor = 0;
return 0;
}
Что мне не хватает?
Вы не забыли настроить ядро для его компиляции? – technosaurus
я сделал. Я также добавил необходимые изменения в make-файл. – Shookie