Создание нового системного вызова (Создание нового системного вызова)

Модератор: Модераторы разделов

Аватара пользователя
netelis
Сообщения: 95
ОС: Debian Wheezy i686

Создание нового системного вызова

Сообщение netelis »

У меня ядро linux-2.6.32. Создаю свой системный вызов mysyscall. Прописую в файл linux-2.6.32/arch/x86/kernel/syscall_table_32.S, и в файл linux-2.6.32/include/asm-generic/unistd.h номер системного вызова #define __NR_mysyscall <номер системного вызова>, для того чтоб функция была доступна с пространства пользователя прописую её в файл /usr/include/bits/syscall.h #define SYS_mysyscall __NR_mysyscall.Там чтоб системный вызов был доступен в пространстве пользователя надо создать файл в /usr/include/mysyscall.h
#define __NR_mysyscall номер моего системного вызова
_syscalln(long,mysyscall,type1,arg1,type2,arg2,.....,typen,argn);
Далее я подключаю этот файл в своей пользовательской программе, и всё равно выдаёт что функция mysyscall не доступна. Ещё пишут что макрос _syscalln находится в файле /usr/src/linux/include/asm-i386/unistd.h. Мой системный вызов не имеет параметров и должен вывести одну строку.

Код: Выделить всё

asmlinkage long sys_mysyscall(void)
{
printk(KERN_INFO"mysyscall\n");
return 5;
};

При компиляции выводит

Код: Выделить всё

In file included from p1.c:3:
/usr/include/mysyscall.h:2: error: expected declaration specifiers or ‘...’ before numeric constant
p1.c: In function ‘_syscall0’:
p1.c:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
p1.c:11: error: expected declaration specifiers before ‘;’ token
/usr/include/mysyscall.h:2: error: parameter name omitted
p1.c:11: error: expected ‘{’ at end of input

Что у меня не так?
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Создание нового системного вызова

Сообщение AestheteAnimus »

Потеряли какой-то хидер, вот он и ругается, что непонятные символы встречаются там, где ожидается совсем другое. Проверьте, где объявлен asmlinkage?
Спасибо сказали:
Аватара пользователя
netelis
Сообщения: 95
ОС: Debian Wheezy i686

Re: Создание нового системного вызова

Сообщение netelis »

Я по статье делал http://www.opennet.ru/base/dev/new_linux_syscall.txt.html . И прописал его в kernel/sched.c . У меня есть предположение что я пропустил linux/linkage.h включить. Интересно былоб знать что значит /usr/include/mysyscall.h:15: error: expected identifier before numeric constant. Всё равно не работает. Из тойже статьи там есть мейкфайл для создания исполняемого модуля

Код: Выделить всё

INCDIR  = /usr/src/linux-2.6.32/include
.PHONY = clean

p1: p1.o
        gcc -I$(INCDIR) $^ -o $@

%.o: %.c
        gcc -I$(INCDIR) -c $^

clean:
        rm -f *.o
        rm -f ./p1

Выдаёт Makefile:5: *** missing separator (did you mean TAB instead of 8 spaces?). Stop. , в чём тут ошибка в мейкфайле?
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Создание нового системного вызова

Сообщение AestheteAnimus »

Во-первых, ошибка
"error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token"
уже устранена?

Во-вторых в Makefile у вас и правда ошибка. Когда записываете команды, то впереди них должна быть табуляция, а не пробелы.

В-третьих, здесь
"/usr/include/mysyscall.h:15: error: expected identifier before numeric constant"
сложно что-то вообще сказать, не видя исходник. Ошибки-то синтаксические и тянутся они порой намного дальше, чем то место, где выругался компилятор.
Спасибо сказали:
Аватара пользователя
netelis
Сообщения: 95
ОС: Debian Wheezy i686

Re: Создание нового системного вызова

Сообщение netelis »

/usr/include/mysyscall.h

Код: Выделить всё

#define NR_mysyscall 1080
#include <unistd.h>
/*
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
        : "=a" (__res) \
        : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
                  "d" ((long)(arg3))); \
__syscall_return(type,__res); \
}
;*/
_syscall0(int, NR_mysyscall)
Спасибо сказали: