当前位置: 技术问答>linux和unix
请问如何传用户空间数组到驱动程序?
来源: 互联网 发布时间:2016-08-26
本文导语: 现在有个问题,比如我在用户空间定义了数组buffer[100],而内核空间里如何调用到这个数组呢?xdjm们指点下哈! | 既然你能够把一个数组传进去,难道就不能把一个 “长度” 传进去吗? 你可以使用一个...
现在有个问题,比如我在用户空间定义了数组buffer[100],而内核空间里如何调用到这个数组呢?xdjm们指点下哈!
|
既然你能够把一个数组传进去,难道就不能把一个 “长度” 传进去吗?
你可以使用一个结构:
struct array{
int elementCount;
int buffer[30];
};
把这个就够传进去,就能够控制printk的次数了
你可以使用一个结构:
struct array{
int elementCount;
int buffer[30];
};
把这个就够传进去,就能够控制printk的次数了
|
copy_from_user();
|
同上,用 copy_from_user();
具体使用请查看内核源码头文件说明 或者 《设备驱动程序》第三版
具体使用请查看内核源码头文件说明 或者 《设备驱动程序》第三版
|
ioctl,在内核中是否仅仅判断长度为30才处理,否则会出错返回;因此有可能会造成“宏无效”;
write,可以直接传递任意长度,但是必须内核事前分配好一个比较大的空间,否则可能会溢出造成“段错误”(增加长度参数检查,又会限制了长度)
write,可以直接传递任意长度,但是必须内核事前分配好一个比较大的空间,否则可能会溢出造成“段错误”(增加长度参数检查,又会限制了长度)
|
建议用writev的方式比较好
|
不知道楼主内核部分的代码和应用层的代码所用的结构体
struct array{
int elementCount;
int buffer[30];
};
是完全一致的么,包括数组的个数?
我调试了一下,内核可以获取用户空间的数组。不知道你应用层的代码是怎么写的?
struct array{
int elementCount;
int buffer[30];
};
是完全一致的么,包括数组的个数?
我调试了一下,内核可以获取用户空间的数组。不知道你应用层的代码是怎么写的?
|
可以在驱动中创建一个proc文件,使用这个文件向驱动中写数据。