Я пытаюсь добавить собственный системный вызов в ядро 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 для его исправления?
'copy_to_user (data, & a, sizeof a)' и инициализировать 'data' как указатель на что-то? – zch
Я инициализировал данные как указатель на переменную. Тем не менее, он показывает старое значение переменной (я отредактировал сообщение выше). – yildizabdullah
Я нашел проблему. В файле /usr/include/linux/mysyscall.h _syscall1 (int, mysyscall, int, \ * data) должна быть _syscall1 (int, mysyscall, int \ *, data). Спасибо за помощь. – yildizabdullah