我正在尝试将自定义系统调用添加到linux内核中。这是一个简单的代码:
#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来修复它?
答案 0 :(得分:3)
复制到用户代码行只复制'a'中的一个字节。如果是小端系统,它将为0.复制所有4个字节以获得正确的结果。