套接字數據緩存(socket buffer)在Linux內核中表示為:struct sk_buff,是Linux內核中數據包管理的基本單元,主要包含兩個部分,其一:管理數據,即數據包的管理信息;其二:報文數據,保存了實際網絡中傳輸的數據,在內核協議棧起承上啟下的作用,也有很多值得關注的sk_buff操作。
1、sk_buff四大指針與相關操作
**分配初始化:**struct sk_buff中四個指針都指向數據區,分別是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函數進行內存分配,分配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指向數據緩沖區的尾部。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5090文章
19176瀏覽量
306934 -
內核
+關注
關注
3文章
1382瀏覽量
40375 -
Linux
+關注
關注
87文章
11342瀏覽量
210154 -
內存
+關注
關注
8文章
3052瀏覽量
74225
發布評論請先 登錄
相關推薦
Linux sk_buff四大指針與相關操作
在以上文章中,沒有分析過Linux內核網絡關鍵的數據結構-套接字數據緩存struct sk_buff,本文將第一次分享到sk_buff,但鑒于其在內核網絡中一些復雜
發表于 10-13 17:23
?4728次閱讀
Linux內存點滴 用戶進程內存空間
文件VM分配與釋放“內存總是被進程占用”,這句話換過來可以這么理解:進程總是需要內存。當fork()或者exec()一個進程的時候,系統內核就會分配一定量的VM給進程,作為進程的
發表于 08-14 16:23
DM8127使用SWOSD_TI_alloc()分配內存空間怎么加大?
DM8127使用SWOSD_TI_alloc()分配內存空間不夠,請問在什么文件里怎樣修改加大內存空間???
發表于 04-16 10:56
ARM32 Linux的內存布局
看我們實際上內存布局是怎么樣的?Linux內核在啟動時,會打印出內核內存空間的布局圖,下面是ARM IMX6平臺打印出來的內存空間布局圖這部
發表于 04-24 14:20
RTThread的動態內存空間該如何去分配呢
關于rtt的動態內存空間分配,想問一下以下我的幾點理解是對的嗎1、我看RTT NANO和MASTER版本的動態內存分配好像不太一樣,我的理解是MASTER版本的動態
發表于 08-31 14:34
Linux網絡設備驅動程序
當要發送數據包的時候,內核必須建立一個包含傳輸數據的sk_buff,然后將sk_buff交給下層,各層在sk_buff遞交給下一層,各層在
發表于 05-10 11:15
?1839次閱讀
如何讓你的手機省出內存空間
大家都知道,手機使用久了就會變得很卡頓,除了手機本身“老化”之外,還有一個重要的原因就是內存堆積的太多了。事實上占用手機內存的無非就是照片、視頻、微信等等,如果好好處理一下這幾個方面的
網卡的Ring Buffer詳解
DMA 將 NIC 接收的數據包逐個寫入 sk_buff ,一個數據包可能占用多個 sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。
網卡的Ring Buffer詳解
DMA 將 NIC 接收的數據包逐個寫入 sk_buff ,一個數據包可能占用多個 sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。
sk_buff內存空間布局情況與相關操作(二)
操作tailroom中用戶數據塊區域:skb_put用于修改指向數據區末尾的指針tail: void *skb_put( struct sk_buff *skb, unsigned int len
sk_buff內存空間布局情況與相關操作(三)
2、非線性區域 在1、中,可以看到每張sk_buff的圖: 在end指針緊挨著一個非線性區域 ; 在struct sk_buff中沒有指向skb_shared_info結構的指針,利用end指針
淺析新能源電動汽車充電樁空間布局優化研究
新能源汽車充電樁空間布局優化研究是一個復雜而重要的問題,要以用戶實際需求為出發點,需要綜合考慮充電樁的數量和分布、供電能力和供電網絡的可靠性以及充電樁的建設和運營管理等因素.通過優化充電樁的空間布局,可以提高新能源汽車的充電便利
評論