Я создал два новых системных вызовов, но когда я пытаюсь их протестировать, я получаю следующую ошибку:
[email protected]:~/test$ gcc test.c
test.c: In function ‘newcall’:
test.c:6:17: error: ‘sys_get_slob_amnt_free’ undeclared (first use in this function)
test.c:6:17: note: each undeclared identifier is reported only once for each function it appears in
[email protected]:~/test$
Я также пробовал это с помощью syscall (sys_get_slob_amnt_free) с тем же результатом.
Вот тестовый код:
#include <unistd.h>
#include <stdio.h>
unsigned long newcall()
{
return syscall(__NR_get_slob_amnt_free);
}
int main()
{
printf("%d\n", newcall());
return 0;
}
Чтобы добавить их, я помещаю их в таблицу syscall (/usr/src/linux-3.0/include/asm-generic/unistd.h)
#define __NR_sendmmsg 269
__SC_COMP(__NR_sendmmsg, sys_ sendmmsg, compat_sys_sendmmsg)
/** my changes here **/
#define __NR_get_slob_amnt_free 270
__SYSCALL(__NR__get_slob_amnt_free, sys_get_slob_amnt_free)
#define __NR_get_slob_amnt_claimed 271)
__SYSCALL(__NR_get_slob_amnt_claimed, sys_get_slob_amnt_claimed)
/** /my changes **/
#undef __NR_syscalls
#define __NR_syscalls 272
И вот код для самих вызовов (../linux-3.0/mm/slob.c)
asmlinkage unsigned int sys_get_slob_amnt_claimed()
{
return memClaimed;
}
asmlinkage unsigned int sys_get_slob_amnt_free()
{
return memClaimed - memUsed;
}
Я пытаюсь выяснить, не запутал ли я тестовый код (может быть, мне нужно включить что-то еще или связать что-нибудь?) Или, если я упустил что-то в добавлении системного вызова в первую очередь. С учетом того, сколько времени потребуется для перекомпиляции ядра, это действительно помогло бы мне узнать, с чего начать.
По общему признанию, это связано с домашним заданием. Назначение - это изменение slob.c, с которым у меня неплохая ручка. Я просто делаю это, чтобы заглянуть в то, что изменения, которые я сделал до сих пор, идут куда угодно. Я ценю любые рекомендации, которые вы можете дать. Спасибо!
Изменить: разрешено (или, по крайней мере, достаточно для меня).
Большое спасибо bdonlan! Хотя syscall(270)
не делал этого напрямую, это забивало мою память - есть еще один набор релевантных чисел, которые я пренебрегал полностью. Файл /linux-3.0/arch/x86/kernel/syscall_table_32.c
также необходимо изменить, чтобы правильно добавить системный вызов.
Как только я добавил .long sys_get_slob_amnt_free
и .long sys_get_slob_amnt_claimed
в этот файл и перестроил ядро, я мог бы ударить по syscalls с помощью syscall(###)
, где ### - нумерация в syscall_table_32.c(а не нумерация в unistd.h). Я чувствую, что они должны совпадать, но поскольку это просто прославленная отладочная информация, я думаю, что оставлю эту тайну в другой раз и просто назову это хорошо.