Плохой адрес при добавлении системного вызова
Я загрузил ядро 2.6.38-5 и хочу добавить системный вызов.
Я сделал следующее:
-
Я добавил системный вызов в таблицу системных вызовов,
<src folder>/arc/x86/kernel/syscall_table_32.S
.long sys_mycall
-
Я добавил номер системного вызова,
<src folder>/include/asm-generic/unistd.h
#define __NR_mycall 244
__SYSCALL(__NR_mycall, sys_mycall)
-
Я добавил прототип в syscalls.h
;
<src follder>/include/linux/syscalls.h
asmlinkage long sys_mycall(long input);
-
И вот мой системный вызов;
asmlinkage long sys_mycall(long input) {
return (input * 2);
}
-
Я также редактировал Makefile.
Теперь после компиляции, когда я использую его через syscall()
, он дает мне BAD ADDRESS
с errno, установленным в 14.
Что мне делать?
Ответы
Ответ 1
В x86 системный номер 244 уже занят get_thread_area(), который принимает в качестве первого аргумента указатель на struct user_desc
:
int get_thread_area(struct user_desc *u_info);
Вы передаете число вместо указателя, ядро пытается интерпретировать его как указатель, определяя, что оно указывает вне вашего процесса, и возвращает -EFAULT
.
Ответ 2
Syscalls запрашивает текущее ядро. Функция сопоставляется с адресным пространством в ядре. Если вы не установите это ядро и перезагрузите компьютер, адрес будет недействительным.