struct in_device// IP配置块,网络设备层与IPv4相关配置
{
struct net_device *dev;// 指向所属大的网络设备
atomic_t refcnt;//引用计数器
int dead;// 1,表示不可在访问
struct in_ifaddr *ifa_list; /* IP ifaddr chain*/
rwlock_t mc_list_lock;
struct ip_mc_list *mc_list; /* IP multicast filter chain */
spinlock_t mc_tomb_lock;
struct ip_mc_list *mc_tomb;
unsigned long mr_v1_seen;
unsigned long mr_v2_seen;
unsigned long mr_maxdelay;
unsigned char mr_qrv;
unsigned char mr_gq_running;
unsigned char mr_ifc_count;
struct timer_list mr_gq_timer; /* general query timer */
struct timer_list mr_ifc_timer; /* interface change timer */
struct neigh_parms *arp_parms;
struct ipv4_devconf cnf;//IPv4设置
struct rcu_head rcu_head;//??
};
该结构存在net_device结构成员ip_ptr中,通过in_dev_get()访问。使refcnt计数器加1,
访问结束调用in_dev_put()递减计数器。
用in_ifaddr 存储主机的IP地址等地址信息。有几个IP地址,就有几个该结构。
struct in_ifaddr结构体的定义:
struct in_ifaddr
{
struct in_ifaddr *ifa_next;
struct in_device *ifa_dev;//所属IP块
struct rcu_head rcu_head;
u32 ifa_local;
u32 ifa_address;
u32 ifa_mask;
u32 ifa_broadcast;
u32 ifa_anycast;
unsigned char ifa_scope;
unsigned char ifa_flags;
unsigned char ifa_prefixlen;
char ifa_label[IFNAMSIZ];
};
copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被
拷贝的字节数,成功返回0.
copy_from_user的目的是防止用户程序欺骗内核,将一个非法的地址传进去,如果没有它,
这一非法地址就检测不到,内核就会访问这个地址指向的数据。因为在内核中访问任何地
址都没有保护,如果不幸访问一个错误的内存地址会搞死内核或发生更严重的问题。
copy_from/to_user的另一个功能就是缺页异常的处理,可以在内核态正确的处理
由于用户地址空间产生的缺页异常。
阅读(2719) | 评论(0) | 转发(0) |