Linux kernel 如何使用“复制到用户”

Linux kernel 如何使用“复制到用户”,linux-kernel,system-calls,Linux Kernel,System Calls,我正试图在linux内核中添加一个自定义系统调用。下面是一个简单的代码: #包括 #包括 #包括 #包括 ASMINT系统调用(int*数据){ INTA=3; cli(); 将_复制到_用户(数据和a,1); sti(); printk(KERN_EMERG“用%d\n调用”,a); 返回a; } 我可以编译添加了mysyscall的内核,当我尝试使用以下用户程序访问它时: #包括 内部主(空){ int*数据; INTR; int a=0; 数据=&a; r=mysyscall(数据);

我正试图在linux内核中添加一个自定义系统调用。下面是一个简单的代码:

#包括
#包括
#包括
#包括
ASMINT系统调用(int*数据){
INTA=3;
cli();
将_复制到_用户(数据和a,1);
sti();
printk(KERN_EMERG“用%d\n调用”,a);
返回a;
}
我可以编译添加了mysyscall的内核,当我尝试使用以下用户程序访问它时:

#包括
内部主(空){
int*数据;
INTR;
int a=0;
数据=&a;
r=mysyscall(数据);
printf(“r为%d,数据为%d”,r,*数据);
}
*数据不等于3,而是等于0


我应该如何使用copy\u to\u user来修复它?

copy to user代码行只从“a”复制一个字节。对于小端系统,它将是0。复制所有4个字节以获得正确的结果。

复制到用户(数据,&a,大小a)
并初始化
数据作为指向某个对象的指针?我发现了问题。在/usr/include/linux/mysyscall.h文件中_syscall1(int,mysyscall,int,*data)行必须是_syscall1(int,mysyscall,int*,data)。谢谢您的帮助。您仍然需要
sizeof
来复制整个
int
。如果没有它,它将无法正常工作(以
inta=260
为例)。在某些情况下,它现在可能会工作。您正在禁用
copy\u to\u user
调用周围的中断,这是完全不允许的。我看不出禁用中断可能有什么作用。@yildizabdullah你为什么这么认为?中断一直在发生,除非你有一个特定的原因为什么中断不应该发生,否则你不能禁用它们。在这种情况下,
copy_to_user
可能会触发一个页面错误,该错误可能需要睡眠来处理(例如,当页面不在内存中且必须从磁盘加载时)。不允许在禁用中断的情况下睡觉。这将要么马上发出Oops,要么只是冻结。