+ -
当前位置:首页 → 问答吧 → 有关内核的一条小指令--很有学习的意义

有关内核的一条小指令--很有学习的意义

时间:2008-12-24

来源:互联网

struct whed_usb_priv
{
    struct usb_device * usb_dev;
    struct net_device * net_dev;
    whed_urb_tx_queue  *tx_qu;
    struct tasklet_struct rx_bh;
    spinlock_t q_lock;
    struct semaphore dpriv_sem;
    struct completion get_mac_completion;
//    u32 usb_membase;
//    u32 usb_memsize;
//    u32 usb_irq;
    struct whed_usb_rx rx[RING_RX_BUF_SIZE];
    struct whed_usb_tx tx;
    u8    next_rx_bulkin_index;
    u8    tx_in_use;
    u8    clean_up;
    u8    bulk_in_addr;

    struct list_head tx_list;
    spinlock_t tx_lock;
    u8    tx_counter;
   
    u8     *ctrl_buff;
    u32    usb_tx_size;
    void * priv;
};

dpriv = (struct whed_usb_priv *)ndev->priv;

dpriv->priv = (void *)(((long)(dpriv + 1) + 31) & ~31);//转化为long形+31 相当于+31*4个字节
大家可以讨论一下:dpriv->priv = (void *)(((long)(dpriv + 1) + 31) & ~31 有什么意义??
(void *)(((long)(dpriv + 1) + 31) & ~31)相当于dpriv加上多少个字节??31*4+1个?? dpriv->priv=......到底把什么给dpriv->priv了???      

作者: liuxiangqian   发布时间: 2008-12-24

语句意义在于保证 (((long)(dpriv + 1) + 31) & ~31) 的结果低5位为0。
dpriv您分成2个部分  dpriv=dprivH+dprivL.    dprivH=dpriv-dpriv%32; dprivL=dpriv%32;
上边的算式可以如下表示:
(long)(dprivH)&~31+(long)(dprivL+1+31)&~31
因为dprivL的值为0~31,所以上面的表达式值为
dprivH+32      

作者: 风雪狂客   发布时间: 2008-12-26