套接字數(shù)據(jù)緩存(socket buffer)在Linux內(nèi)核中表示為:struct sk_buff,是Linux內(nèi)核中數(shù)據(jù)包管理的基本單元,主要包含兩個部分,其一:管理數(shù)據(jù),即數(shù)據(jù)包的管理信息;其二:報文數(shù)據(jù),保存了實際網(wǎng)絡中傳輸?shù)臄?shù)據(jù),在內(nèi)核協(xié)議棧起承上啟下的作用,也有很多值得關注的sk_buff操作。
1、sk_buff四大指針與相關操作
**分配初始化:**struct sk_buff中四個指針都指向數(shù)據(jù)區(qū),分別是head、data、tail、end,剛剛分配出來的sk_buff會立馬進行四大指針的初始操作。
分配sk_buff如下所示:
struct sk_buff *buff;
buff = sk_stream_alloc_skb(sk, 0, sk- >sk_allocation, true);
sk_stream_alloc_skb最終調用__alloc_skb函數(shù)進行內(nèi)存分配,分配skb后,進行四大指針的初始化操作:
struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
int flags, int node)
{
struct sk_buff *skb;
skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node)
skb- >head = data;
skb- >data = data;
skb_reset_tail_pointer(skb);
skb- >end = skb- >tail + size;
}
其中skb_reset_tail_pointer(skb):
static inline void skb_reset_tail_pointer(struct sk_buff *skb)
{
skb- >tail = skb- >data;
}
最終四大指針初始化為以下圖所示:
此時head、data、tail三個指針指向一起,end指向數(shù)據(jù)緩沖區(qū)的尾部。
-
嵌入式
+關注
關注
5150文章
19665瀏覽量
317426 -
內(nèi)核
+關注
關注
3文章
1416瀏覽量
41420 -
Linux
+關注
關注
87文章
11509瀏覽量
213741 -
內(nèi)存
+關注
關注
8文章
3123瀏覽量
75251
發(fā)布評論請先 登錄
Linux sk_buff四大指針與相關操作

Linux內(nèi)存點滴 用戶進程內(nèi)存空間
DM8127使用SWOSD_TI_alloc()分配內(nèi)存空間怎么加大?
ARM32 Linux的內(nèi)存布局
RTThread的動態(tài)內(nèi)存空間該如何去分配呢
Linux網(wǎng)絡設備驅動程序
如何讓你的手機省出內(nèi)存空間
網(wǎng)卡的Ring Buffer詳解
網(wǎng)卡的Ring Buffer詳解
sk_buff內(nèi)存空間布局情況與相關操作(二)

sk_buff內(nèi)存空間布局情況與相關操作(三)

淺析新能源電動汽車充電樁空間布局優(yōu)化研究

評論