2014-09-03 36 views
0

我想使用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 

阅读更多关于此这里:

回答

1

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); 
+0

非常感谢,它的作品! – 2014-09-03 12:55:01

0

在平台网设备驱动程序更改读取方法http://www.codeproject.com/Articles/112474/A-Simple-Driver-for-Linux-OS

+0

感谢您为well.But在我的目标板,结构net_device_ops没有读函数指针(所以我真的不知道从哪里变)。而我不明白的意思func(&position1,position)。为什么你的copy_to_user()看起来不同于只有3个参数的原型? – 2014-09-03 13:09:36

+0

更正!但是你打算只使用Ioctl吗?如果是的话,我认为你应该考虑查看上面的@nos示例或者请发布简洁的要求。 – Raulp 2014-09-04 03:38:53

+0

我正在学习内核和用户之间的沟通。你说的是另一种方式,也是有用的,但不适用于这种情况。在struct net_device_ops中,它没有读取函数指针。我在struct中找到它file_operations,所以下次我会知道如何处理你的帮助。 – 2014-09-04 06:53:22

相关问题