日期 : 2022-11-30 19:16:41作者 : 熊人
V 站高人比較多,請教個問題。我在學習網卡驅動,看的是<<深入理解 linux 網絡技術內幕>>這本書.里面用的是 3c59x 網卡的例子( 3c59x.c ).其中在申請 buffer 的時候,先是從寄存器里面讀取信息賦值給 rx_status.然后通過 rx_status & 0x1ffff 得到 packet 的大小。但使用 dev_alloc_skb (最新的內核使用 netdev_alloc_skb 函數)分配 buffer 的時候為什么還要加 5 呢?
網上找了找,有個網友說這是一種保護機制。沒有細講,不是很明白。找了 linux 的遠古 commit 歷史,也沒有說明。有懂的 V 友能詳細說說嗎?
/* The packet length: up to 4.5K!. */
short pkt_len = rx_status & 0x1fff;
struct sk_buff *skb;
skb = dev_alloc_skb(pkt_len + 5);
要不是為了 buffer alignment ,要不是加上了某個 header 的最小長度是個魔法數,換句話說 dev_alloc_skb(0)也沒有實際意義吧。