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

Я скачал ядро ​​2.6.38-5 и хочу добавить системный вызов. Я сделал следующее:

  1. Я добавил свой системный вызов в таблицу системных вызовов;

    <src folder>/arc/x86/kernel/syscall_table_32.S
    
    .long sys_mycall
    
  2. Я добавил номер системного вызова;

    <src folder>/include/asm-generic/unistd.h
    
    #define __NR_mycall 244
    __SYSCALL(__NR_mycall, sys_mycall)
    
  3. Я добавил прототип в syscalls.h;

    <src follder>/include/linux/syscalls.h
    
    asmlinkage long sys_mycall(long input);
    
  4. И вот мой системный вызов;

    asmlinkage long sys_mycall(long input) {
        return (input * 2);
    }
    
  5. Я также редактировал Makefiles.

Теперь, после компиляции, когда я использую его через syscall(), он дает мне BAD ADDRESS с errno, установленным на 14.

Что я должен делать?


person Majid Azimi    schedule 14.05.2011    source источник
comment
+1, поздравляю с удовлетворительно полным описанием и минимальным знанием вашей проблемы. Вы не можете себе представить, что новые люди, приходящие сюда, задают очень общие вопросы о вещах очень низкого уровня.   -  person zneak    schedule 14.05.2011


Ответы (2)


В x86 номер системного вызова 244 уже занят get_thread_area( ), который принимает в качестве первого аргумента указатель на struct user_desc:

int get_thread_area(struct user_desc *u_info);

Вы передаете число вместо указателя, ядро ​​пытается интерпретировать его как указатель, определяет, что оно указывает вне вашего процесса, и возвращает -EFAULT.

person ninjalj    schedule 14.05.2011
comment
Ты прав. Согласно этому файлу /usr/include/asm/unistd_32.h единственный номер системного вызова, доступный в диапазоне 244–259, — это 251. Поэтому я изменил свой номер системного вызова на 251. Но на этот раз он говорит: Function not implemented с errno = 38 - person Majid Azimi; 15.05.2011

Системные вызовы запрашивают работающее ядро. Функция сопоставляется с адресным пространством в ядре. Если вы не установите это ядро ​​и не перезагрузите машину, адрес будет недействительным.

person Mel    schedule 14.05.2011
comment
Не похоже на ответ для меня - person Dani; 14.05.2011
comment
Да, я установил новый образ ядра и заголовки ядра. Но это не работает! - person Majid Azimi; 14.05.2011