Плохой адрес при добавлении системного вызова

Я загрузил ядро ​​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 запрашивает текущее ядро. Функция сопоставляется с адресным пространством в ядре. Если вы не установите это ядро ​​и перезагрузите компьютер, адрес будет недействительным.