Chinaunix首页 | 论坛 | 博客
  • 博客访问: 307398
  • 博文数量: 56
  • 博客积分: 2058
  • 博客等级: 中尉
  • 技术积分: 688
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-11 09:19
个人简介

code rush

文章分类

全部博文(56)

文章存档

2012年(2)

2011年(54)

分类: LINUX

2011-07-09 23:09:41


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的另一个功能就是缺页异常的处理,可以在内核态正确的处理
由于用户地址空间产生的缺页异常。



阅读(2408) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~