Новый системный вызов не найден (ядро Linux 3.0.0), с чего мне начать искать? - PullRequest
20 голосов
/ 07 декабря 2011

Я создал два новых системных вызова, но когда я пытаюсь их протестировать, я получаю следующую ошибку:

matt@ubuntu:~/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
matt@ubuntu:~/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;
}

Чтобы добавить их, я поместил их в таблицу системных вызовов (/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 к этому файлу и перестроил ядро, я мог поразить свои системные вызовы, используя syscall(###), где ### - нумерация в syscall_table_32.c (не нумерация вunistd.h).Я чувствую, что они должны совпадать - но так как это просто прославленная отладочная информация, я думаю, что оставлю эту тайну в другой раз и просто назову ее хорошей.

1 Ответ

2 голосов
/ 05 мая 2012

Есть еще один набор соответствующих номеров, которые мне нужно было добавить. Файл /linux-3.0/arch/x86/kernel/syscall_table_32.c также необходимо изменить, чтобы правильно добавить системный вызов.

После того, как я добавил .long sys_get_slob_amnt_free и .long sys_get_slob_amnt_claimed в этот файл и перестроил ядро, я мог выполнить свои системные вызовы, используя syscall (###), где ### - нумерация в syscall_table_32.c (не нумерация в unistd.h)

...