2013-11-17 3 views
7

Я пытаюсь добавить собственный системный вызов в ядро ​​linux. Вот простой код:Как использовать copy_to_user

#include <linux/mysyscall.h> 
#include <linux/kernel.h> 
#include <asm/uaccess.h> 
#include <asm/system.h> 

asmlinkage int sys_mysyscall(int *data){ 

    int a = 3; 

    cli(); 
    copy_to_user(data, &a, 1); 
    sti(); 

    printk(KERN_EMERG "Called with %d\n", a); 

    return a; 
} 

я могу скомпилировать ядро ​​с добавлением mysyscall и когда я пытаюсь получить доступ к нему с помощью пользовательской программы, как:

#include <linux/mysyscall.h> 

int main(void){ 

    int *data; 
    int r; 
    int a = 0; 
    data = &a; 

    r = mysyscall(data); 

    printf("r is %d and data is %d", r, *data); 
} 

* данные не равна 3 она равна до 0.

Как использовать copy_to_user для его исправления?

+1

'copy_to_user (data, & a, sizeof a)' и инициализировать 'data' как указатель на что-то? – zch

+0

Я инициализировал данные как указатель на переменную. Тем не менее, он показывает старое значение переменной (я отредактировал сообщение выше). – yildizabdullah

+1

Я нашел проблему. В файле /usr/include/linux/mysyscall.h _syscall1 (int, mysyscall, int, \ * data) должна быть _syscall1 (int, mysyscall, int \ *, data). Спасибо за помощь. – yildizabdullah

ответ

1

Копия строки пользовательского кода копирует только один байт из 'a'. В случае маленьких конечных систем это будет 0. Скопируйте все 4 байта, чтобы получить правильный результат.

Смежные вопросы