2014-06-05 39 views
2

對於Linux內核2.4或2.6早於2.6.31,所述net_device結構爲每個註冊的網絡設備具有與之相關聯的私人數據塊,這是由在net_device結構中的priv指針所指向。但是,對於內核版本2.6.32或更高版本,priv指針已被棄用。Linux內核2.6.32或更高版本中爲每個net_device存儲的私有數據在哪裏?

我想知道網絡接口驅動程序的私有數據可以現在存儲。有沒有人清除net_device結構的相對較新的實現?提前致謝。

回答

3

這個答案引用了Linux內核的version 3.14

將私人數據存儲在net_device結構的末端

您分配net_device通過調用alloc_netdev,這只是一個宏爲alloc_netdev_mqs。第一個參數是int sizeof_priv,指定的額外空間,您希望在net_device爲您的私人數據最終要分配的金額。

您可以通過調用(內聯)函數netdev_priv訪問這個私人數據。通過查看功能,你可以看到它會返回一個指針對準真正struct net_device結束後:

static inline void *netdev_priv(const struct net_device *dev) 
{ 
    return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN); 
} 

我要去承擔,開發商這樣做的原因緩存。這樣,私有數據會落在同一緩存行的結構的其餘部分,而不必通過priv指針來訪問內存非常遠離net_device


作爲一個例子,英特爾e100驅動定義e100.c私人struct nic,並分配其在e100_probenet_device。你看它傳遞給sizeof(struct nic)alloc_etherdev,這是一個方便的功能分配以太網設備:

static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 
{ 
    struct net_device *netdev; 
    struct nic *nic; 
    int err; 

    if (!(netdev = alloc_etherdev(sizeof(struct nic)))) 
     return -ENOMEM; 

然後在其他地方訪問這個私人數據,他們稱之爲netdev_priv,因爲在這裏看到在mdio_write

static void mdio_write(struct net_device *netdev, int addr, int reg, int data) 
{ 
    struct nic *nic = netdev_priv(netdev); 

    nic->mdio_ctrl(nic, addr, mdi_write, reg, data); 
} 
相關問題