tail += len ; skb- > len += len ; if (unlikely(skb- >tail > skb- >end)) skb_over_panic(skb, len , __builtin_return_address( 0 )); return tmp;} 可以看到 tail指針的移動是擴大數據區域 ,即數據區向下擴大len字節,并更新數據區長度len。 增加headroom區域的協議頭: skb_push函數用于移動data指針,增加頭部協議, 與skb_reserve()類" />

色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

sk_buff內存空間布局情況與相關操作(二)

麥辣雞腿堡 ? 來源:技術簡說 ? 作者:董旭 ? 2023-07-30 16:47 ? 次閱讀

操作tailroom中用戶數據塊區域:skb_put用于修改指向數據區末尾的指針tail:

void *skb_put(struct sk_buff *skb, unsigned int len)
{
 void *tmp = skb_tail_pointer(skb);
 SKB_LINEAR_ASSERT(skb);
 skb- >tail += len;
 skb- >len  += len;
 if (unlikely(skb- >tail > skb- >end))
  skb_over_panic(skb, len, __builtin_return_address(0));
 return tmp;
}

圖片

可以看到 tail指針的移動是擴大數據區域 ,即數據區向下擴大len字節,并更新數據區長度len。

增加headroom區域的協議頭: skb_push函數用于移動data指針,增加頭部協議, 與skb_reserve()類似,也并沒有真正向數據緩存區中添加數據,而只是移動數據緩存區的頭指針data。數據由其他函數復制到數據緩存區中。 函數如下:

void *skb_push(struct sk_buff *skb, unsigned int len)
{
 skb- >data -= len;
 skb- >len  += len;
 if (unlikely(skb- >data< skb- >head))
  skb_under_panic(skb, len, __builtin_return_address(0));
 return skb- >data;
}

如下兩張圖分別是由傳輸層、網絡層,數據包向下傳遞時data指針移動,進行頭部協議的封裝。

  • TCP層添加TCP首部。
  • SKB傳遞到IP層,IP層為數據包添加IP首部。
  • SKB傳遞到鏈路層,鏈路層為數據包添加鏈路層首部。

圖片

可以看到在數據包封裝的過程中,每一層移動data指針進行數據報頭的封裝。

數據報文解封裝,解除協議頭: skb_pull通過將data指針向下移動,進行數據報文的解封裝,函數如下所示:

static inline void *__skb_pull(struct sk_buff *skb, unsigned int len)
{
 skb- >len -= len;
 BUG_ON(skb- >len < skb- >data_len);
 return skb- >data += len;
}

如下圖所示,在收包流程上,向上層協議,如下網絡層向傳輸層傳送的時候,調用skb_pull進行數據包的解封裝。

圖片

以上就是struct sk_buff的四大指針的相關操作,通過分析可得:

  • head指向緩沖區的首地址,作為上邊界
  • end指向緩沖區的尾地址,作為下邊界
  • data指針在數據包頭部封裝和解封裝的過程中移動,指向各層的協議頭,skb_push函數將data的指向,向低地址移動(向上),完成協議頭空間的占據,skb_pull函數將data的指向,向高地址移動(向下),完成協議頭的解封裝。
  • tail指針在增加應用層用戶緩沖數據時移動,skb_put函數將該指針向高地址移動(向上),完成用戶數據空間的占據。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5090

    文章

    19176

    瀏覽量

    306934
  • Linux
    +關注

    關注

    87

    文章

    11342

    瀏覽量

    210153
  • 內存
    +關注

    關注

    8

    文章

    3052

    瀏覽量

    74225
  • 指針
    +關注

    關注

    1

    文章

    481

    瀏覽量

    70595
收藏 人收藏

    評論

    相關推薦

    Linux sk_buff四大指針與相關操作

     在以上文章中,沒有分析過Linux內核網絡關鍵的數據結構-套接字數據緩存struct sk_buff,本文將第一次分享到sk_buff,但鑒于其在內核網絡中一些復雜情況,本次只簡單介紹sk_
    發表于 10-13 17:23 ?4728次閱讀
    Linux <b class='flag-5'>sk_buff</b>四大指針與<b class='flag-5'>相關</b><b class='flag-5'>操作</b>

    Linux內存點滴 用戶進程內存空間

    , Data+Stack size (kb)nFLT, Page Fault countnDRT, Dirty Pages count盡管有注釋,但依然感覺有些晦澀,不知所指何意?進程內存空間正在運行的程序,叫進程。每個
    發表于 08-14 16:23

    嵌入式linux TCP/IP協議棧概述

    ;unsigned char *head,//緩存區的頭指針*data;//有效數據頭指針...};sk_buff相關操作函數
    發表于 12-07 10:05

    DM8127使用SWOSD_TI_alloc()分配內存空間怎么加大?

    DM8127使用SWOSD_TI_alloc()分配內存空間不夠,請問在什么文件里怎樣修改加大內存空間???
    發表于 04-16 10:56

    stm32 使用u*** host庫占用內存空間很大!!!

    如何解決stm32 使用u*** host庫占用內存空間很大的問題呢???
    發表于 01-22 16:44

    ARM32 Linux的內存布局

    看我們實際上內存布局是怎么樣的?Linux內核在啟動時,會打印出內核內存空間布局圖,下面是ARM IMX6平臺打印出來的內存空間布局圖這部
    發表于 04-24 14:20

    RTThread的動態內存空間該如何去分配呢

    關于rtt的動態內存空間分配,想問一下以下我的幾點理解是對的嗎1、我看RTT NANO和MASTER版本的動態內存分配好像不太一樣,我的理解是MASTER版本的動態內存位置是從ZI段結束地址到RAM
    發表于 08-31 14:34

    freertos怎么釋放任務的內存空間

    freertos怎么釋放任務的內存空間
    發表于 10-12 07:20

    Linux網絡設備驅動程序

    當要發送數據包的時候,內核必須建立一個包含傳輸數據的sk_buff,然后將sk_buff交給下層,各層在sk_buff遞交給下一層,各層在sk_buff中添加不同的協議貞頭,直到交給網
    發表于 05-10 11:15 ?1839次閱讀

    如何讓你的手機省出內存空間

    大家都知道,手機使用久了就會變得很卡頓,除了手機本身“老化”之外,還有一個重要的原因就是內存堆積的太多了。事實上占用手機內存的無非就是照片、視頻、微信等等,如果好好處理一下這幾個方面的問題,相信你的手機一定能省出不少內存空間,下
    的頭像 發表于 02-13 14:07 ?4340次閱讀

    網卡的Ring Buffer詳解

    DMA 將 NIC 接收的數據包逐個寫入 sk_buff ,一個數據包可能占用多個 sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。
    的頭像 發表于 03-17 14:25 ?1583次閱讀

    網卡的Ring Buffer詳解

    DMA 將 NIC 接收的數據包逐個寫入 sk_buff ,一個數據包可能占用多個 sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。
    的頭像 發表于 04-04 09:15 ?1187次閱讀

    sk_buff內存空間布局情況相關操作(一)

    :報文數據,保存了實際網絡中傳輸的數據,在內核協議棧起承上啟下的作用,也有很多值得關注的sk_buff操作。 1、sk_buff四大指針與相關操作
    的頭像 發表于 07-30 16:43 ?1289次閱讀
    <b class='flag-5'>sk_buff</b><b class='flag-5'>內存空間布局</b><b class='flag-5'>情況</b>與<b class='flag-5'>相關</b><b class='flag-5'>操作</b>(一)

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

    2、非線性區域 在1、中,可以看到每張sk_buff的圖: 在end指針緊挨著一個非線性區域 ; 在struct sk_buff中沒有指向skb_shared_info結構的指針,利用end指針
    的頭像 發表于 07-30 16:48 ?1269次閱讀
    <b class='flag-5'>sk_buff</b><b class='flag-5'>內存空間布局</b><b class='flag-5'>情況</b>與<b class='flag-5'>相關</b><b class='flag-5'>操作</b>(三)

    淺析新能源電動汽車充電樁空間布局優化研究

    新能源汽車充電樁空間布局優化研究是一個復雜而重要的問題,要以用戶實際需求為出發點,需要綜合考慮充電樁的數量和分布、供電能力和供電網絡的可靠性以及充電樁的建設和運營管理等因素.通過優化充電樁的空間布局,可以提高新能源汽車的充電便利性和用戶體驗,推動新能源汽車的發展。
    的頭像 發表于 12-17 09:36 ?376次閱讀
    淺析新能源電動汽車充電樁<b class='flag-5'>空間布局</b>優化研究
    主站蜘蛛池模板: 久草在线精彩免费视频 | 99久视频只有精品2019 | 国产精品视频一区二区猎奇 | 无码AV免费精品一区二区三区 | 国产亚洲精品品视频在线 | 囯产精品久久久久免费蜜桃 | 日韩a视频在线观看 | 国产精品婷婷五月久久久久 | 2019天天射干 | 日韩亚洲中文欧美在线 | 成人性生交大片免费看金瓶七仙女 | 外女思春台湾三级 | 久久伊人中文字幕有码 | 国产精品69人妻无码久久 | 国产亚洲欧美高清在线 | 欧美精品一区二区蜜臀亚洲 | 久久er99热精品一区二区 | 快播h网站| 小玲被公扒开腿 | 在线精品国精品国产不卡 | 国产区在线不卡视频观看 | 国产色婷婷亚洲99麻豆 | 一个人看www| 超碰98人人插 | 日本美女论坛 | 纯h超级大尺度小黄文 | 啊…嗯啊好深男男高h文总受 | 一扒二脱三插片在线观看 | 国产福利视频第一导航 | 灌满内射HP1V1 | 国产传媒18精品免费观看 | 国产精品女上位在线观看 | 丰满的女朋友 在线播放 | 一级做a爰片久久毛片潮喷动漫 | 日本超A大片在线观看 | 嗯 用力啊 嗯 c我 啊哈老师 | YELLOW日本动漫高清免费 | 亚洲精品国偷拍自产在线 | 激情内射亚州一区二区三区爱妻 | 国产人人为我我为人人澡 | 伊人久久大香线蕉电影院 |