2014-09-03 80 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

相關問題