套接字數(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最終調(diào)用__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ū)的尾部。
-
嵌入式
+關注
關注
5086文章
19141瀏覽量
305956 -
內(nèi)核
+關注
關注
3文章
1375瀏覽量
40313 -
Linux
+關注
關注
87文章
11314瀏覽量
209778 -
內(nèi)存
+關注
關注
8文章
3031瀏覽量
74119
發(fā)布評論請先 登錄
相關推薦
評論