如何将用户sapce中的缓冲区地址传递给内核
我想使用copy_to_user()将用户空间中的平台网络设备的某些信息复制到缓冲区中。但是我不知道内核如何知道“to”由copy_to_user()使用的指针。我知道我可以初始化ifreq.name来查找驱动程序的ioctl()。但是我怎样才能将“to”指针传递给内核,完全是driver'ioctl() ?如何将用户sapce中的缓冲区地址传递给内核
在此先感谢!使用cat命令
static ssize_t net_device_read(arg1,char __user *user_buffer,size_t count,loff_t *position)
{
copy_to_user(user_buffer, position,count) != 0
}
访问从用户空间这个缓冲区
cat /dev/net-device
>> string to pass
阅读更多关于此这里:
struct ifreq看起来像这样:
struct ifreq {
char ifr_name[IFNAMSIZ];/* Interface name */
union {
struct sockaddrifr_addr;
struct sockaddrifr_dstaddr;
struct sockaddrifr_broadaddr;
struct sockaddrifr_netmask;
struct sockaddrifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmapifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char * ifr_data;
};
};
如果您正在实施现有的ioctl命令,则必须找出您应该使用的联合中的哪些成员,无论是在用户空间还是内核中。
如果您正在实施自己的ioctl命令,则可以使用ifr_data
。主叫方(用户空间)设置为指向一个本地缓冲区,你会填用copy_to_user()在内核中的成员(即ifr_data是到,你要寻找的。)
即用户空间确实
char buf[128];
struct ifreq req;
strcpy(req.ifr_name,"eth0");
req.ifr_data = buf;
ioctl(fd, SIOCMYIOCTL, &ifr);
这里的缓冲区只是一个固定大小的数组,如果你需要,你可以ofcourse使用结构更灵活,只要用户空间和内核的ioctl()同意什么ifr_data
是。
struct my_ioctl_data {
int a, b, c;
};
struct my_ioctl_data data;
struct ifreq req;
strcpy(req.ifr_name,"eth0");
req.ifr_data = (char*)&data;
ioctl(fd, SIOCMYIOCTL, &ifr);
感谢您为well.But在我的目标板,结构net_device_ops没有读函数指针(所以我真的不知道从哪里变)。而我不明白的意思func(&position1,position)。为什么你的copy_to_user()看起来不同于只有3个参数的原型? – 2014-09-03 13:09:36
更正!但是你打算只使用Ioctl吗?如果是的话,我认为你应该考虑查看上面的@nos示例或者请发布简洁的要求。 – Raulp 2014-09-04 03:38:53
我正在学习内核和用户之间的沟通。你说的是另一种方式,也是有用的,但不适用于这种情况。在struct net_device_ops中,它没有读取函数指针。我在struct中找到它file_operations,所以下次我会知道如何处理你的帮助。 – 2014-09-04 06:53:22
非常感谢,它的作品! – 2014-09-03 12:55:01