對於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
結構的相對較新的實現?提前致謝。
對於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
結構的相對較新的實現?提前致謝。
這個答案引用了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_probe
net_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);
}