Неверный адрес при добавлении системного вызова - PullRequest
14 голосов
/ 14 мая 2011

Я скачал ядро ​​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.

Что мне делать?

Ответы [ 2 ]

5 голосов
/ 14 мая 2011

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

int get_thread_area(struct user_desc *u_info);

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

0 голосов
/ 14 мая 2011

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

...