在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

2、非線性區域

在1、中,可以看到每張sk_buff的圖: 在end指針緊挨著一個非線性區域

在struct sk_buff中沒有指向skb_shared_info結構的指針,利用end指針,,可以用skb_shinfo宏來訪問:

#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))

其中skb_end_pointer函數如下,返回end指針

static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
{
 return skb- >end;
}

具體地,struct skb_shared_info如下:

struct skb_shared_info {
 __u8  __unused;
 __u8  meta_len;

    //數組frags包含的元素個數
 __u8  nr_frags;
 __u8  tx_flags;
 unsigned short gso_size;
 /* Warning: this field is not always filled in (UFO)! */
 unsigned short gso_segs;
 struct sk_buff *frag_list;
 struct skb_shared_hwtstamps hwtstamps;
 unsigned int gso_type;
 u32  tskey;

 /*
  * Warning : all fields before dataref are cleared in __alloc_skb()
  */
 
    //結構skb_shared_info 的引用計數器
 atomic_t dataref;

 /* Intermediate layers must ensure that destructor_arg
  * remains valid until skb destructor */
 void *  destructor_arg;

 /* must be last field, see pskb_expand_head() */
 skb_frag_t frags[MAX_SKB_FRAGS];
};

其中skb_frag_t如下:

typedef struct skb_frag_struct skb_frag_t;

struct skb_frag_struct {
 struct {

    //指向文件系統緩存頁的指針
  struct page *p;
 } page;
#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)

  //數據起始地址在文件系統緩存頁中的偏移
 __u32 page_offset;
  //數據在文件系統緩存頁中使用的長度
 __u32 size;
#else
 __u16 page_offset;
 __u16 size;
#endif
};

nr_frags,frags,frag_list與IP分片存儲有關。

frag_list的用法:

  • 用于在接收分組后鏈接多個分片,組成一個完整的IP數據報
  • 在UDP數據報輸出中,將待分片的SKB鏈接到第一個SKB中,然后在輸出過程中能夠快速的分片
  • 用于存放FRAGLIST類型的聚合分散I/O數據包

判斷是否存在非線性緩沖區:

  • 先說明struct sk_buff中關于長度的兩個字段
  1. len字段:無分片的報文,數據報文的大小
  2. data_len字段:存在分散報文,data_len表示分片的部分大小

如下所示,沒有開啟分片的報文len = x,data_len = 0:

圖片

如下所示在Linux內核中,使用skb_is_nonlinear函數判斷是否存在分片,即通過判斷data_len的大小是否為0:

static inline bool skb_is_nonlinear(const struct sk_buff *skb)
{
 return skb- >data_len;
}
  • 在沒有開啟分片的報文中,數據包長度在struct sk_buff中為len字段的大小,即data到tail的長度,nf_frags為0,frag_list為NULL。

普通聚合分散I/O的報文:

采用聚合分散I/O的報文, frag_list為 NULL,nf_frags不等于0 ,說明這不是一個普通的分片,而是聚合分散I/O的報文。

如下所示:

nr_frags為2,而frag_list為NULL,說明這不是普通的分片,而是聚合分散I/O分片,數量為2,這兩個分片指向同一物理分頁,各自在分頁中的偏移和長度分別是0/S1和S1/S2。

圖片

FRAGLIST類型的分散聚合I/O的報文:

采用FRAGLIST類型的分散聚合I/O報文, ** frag_list不為NULL,nf_frags等于0 ,** 數據長度len為x+S1,data_len為S1,

圖片

以上從struct sk_buff的四大指針以及操作、非線性區域對套接字緩存(socket buffer)進行分析,更多sk_buff的分析、實操等將在以后的文章中梳理。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5143

    文章

    19561

    瀏覽量

    315444
  • Linux
    +關注

    關注

    87

    文章

    11469

    瀏覽量

    212911
  • 內存
    +關注

    關注

    8

    文章

    3111

    瀏覽量

    75032
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Linux sk_buff四大指針與相關操作

     在以上文章中,沒有分析過Linux內核網絡關鍵的數據結構-套接字數據緩存struct sk_buff,本文將第一次分享到sk_buff,但鑒于其在內核網絡中一些復雜情況,本次只簡單介紹sk_
    發表于 10-13 17:23 ?5173次閱讀
    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的動態內存空間該如何去分配呢

    配的Heap_Size,而使用rt_malloc申請到的則是RTT分配的空間然后有以下幾個問題1、如果是動態創建線程,那線程中的局部變量是位于RTT分配的動態內存空間中還是位于棧空間中?2、如果使用一些第
    發表于 08-31 14:34

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

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

    Linux網絡設備驅動程序

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

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

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

    網卡的Ring Buffer詳解

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

    網卡的Ring Buffer詳解

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

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

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

    操作tailroom中用戶數據塊區域:skb_put用于修改指向數據區末尾的指針tail: void *skb_put( struct sk_buff *skb, unsigned int len
    的頭像 發表于 07-30 16:47 ?984次閱讀
    <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 ?923次閱讀
    淺析新能源電動汽車充電樁<b class='flag-5'>空間布局</b>優化研究
    主站蜘蛛池模板: 中文字幕一区二区三区四区五区 | 国产高清成人mv在线观看 | 日本成人资源 | 91噜噜噜 | 亚洲综合久久综合激情久久 | 你懂的网站在线观看 | 亚洲欧洲一区二区三区在线 | 欧美午夜免费观看福利片 | 亚洲一区二区中文字幕 | 中文字幕在线播放不卡 | 婷婷久久综合九色综合九七 | 狠狠干天天爱 | 一级特黄aaa大片在线观看 | 天天干妹子 | 性久久久久久久久久 | 日韩精品在线第一页 | 中文字幕在线播放一区 | 华人被黑人粗大猛然进 | 色综合天天综合网亚洲影院 | 人操人爱 | mm131美女肉体艺术图片 | 久久精品免费 | 美女张开腿让男人桶爽 | 国产精品永久免费自在线观看 | 三级黄色片在线播放 | 欧美在线成人午夜影视 | 色多网站免费视频 | 一区二区三区精品国产欧美 | 欧美天天爽| 亚洲成人三级电影 | 天天拍夜夜添久久精品免费 | 久久综合狠狠综合久久 | 毛片免费高清免费 | 午夜视频网址 | 看5xxaaa免费毛片 | 韩漫免费网站无遮挡羞羞漫画 | a级毛片网站 | 在线看片成人免费视频 | 欧美一级视频在线 | 4438x成人全国 | 欧美色穴 |