套接字?jǐn)?shù)據(jù)緩存(socket buffer)在Linux內(nèi)核中表示為:struct sk_buff,是Linux內(nèi)核中數(shù)據(jù)包管理的基本單元,主要包含兩個(gè)部分,其一:管理數(shù)據(jù),即數(shù)據(jù)包的管理信息;其二:報(bào)文數(shù)據(jù),保存了實(shí)際網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù),在內(nèi)核協(xié)議棧起承上啟下的作用,也有很多值得關(guān)注的sk_buff操作。
1、sk_buff四大指針與相關(guān)操作
**分配初始化:**struct sk_buff中四個(gè)指針都指向數(shù)據(jù)區(qū),分別是head、data、tail、end,剛剛分配出來的sk_buff會(huì)立馬進(jìn)行四大指針的初始操作。
分配sk_buff如下所示:
struct sk_buff *buff;
buff = sk_stream_alloc_skb(sk, 0, sk- >sk_allocation, true);
sk_stream_alloc_skb最終調(diào)用__alloc_skb函數(shù)進(jìn)行內(nèi)存分配,分配skb后,進(jìn)行四大指針的初始化操作:
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;
}
最終四大指針初始化為以下圖所示:
此時(shí)head、data、tail三個(gè)指針指向一起,end指向數(shù)據(jù)緩沖區(qū)的尾部。
-
嵌入式
+關(guān)注
關(guān)注
5103文章
19268瀏覽量
310027 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1391瀏覽量
40602 -
Linux
+關(guān)注
關(guān)注
87文章
11373瀏覽量
211298 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3081瀏覽量
74595
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux sk_buff四大指針與相關(guān)操作

Linux內(nèi)存點(diǎn)滴 用戶進(jìn)程內(nèi)存空間
DM8127使用SWOSD_TI_alloc()分配內(nèi)存空間怎么加大?
stm32 使用u*** host庫(kù)占用內(nèi)存空間很大!!!
ARM32 Linux的內(nèi)存布局
RTThread的動(dòng)態(tài)內(nèi)存空間該如何去分配呢
Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序
如何讓你的手機(jī)省出內(nèi)存空間
網(wǎng)卡的Ring Buffer詳解
網(wǎng)卡的Ring Buffer詳解
sk_buff內(nèi)存空間布局情況與相關(guān)操作(二)

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

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

評(píng)論