日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网卡驱动描述符助手功能浅析

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网卡驱动描述符助手功能浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 前言
    網卡驅動里,CPU和MAC控制器都需要對DMA描述符空間進行讀取或者寫入。DMA描述符空間又會采用到CACHE和零拷貝技術,以往都是驅動自己去申請、關聯內存和刷新(flush和invalidate)CACHE。
    描述符助手則是把這些工作在內核里完成,對驅動提供接口即可,此文就對這些接口功能做一些分析。
  • 創建
    實現發送靜態內存空間申請、發送零拷貝內存創建(但不申請空間)、接收靜態內存空間申請、接收零拷貝內存空間申請,及CACHE刷新。函數原型及入參如程序清單 2.1:
    程序清單 2.1
    /* create descriptor helper /
    struct netdev_desc_helper *
    netdev_desc_helper_create (size_t each_buf_size, / 每幀大小 /
    size_t pad_size, / PAD /
    int cache_ts_en, / 發送靜態內存cache刷新使能 /
    int cache_rs_en, / 接收靜態內存cache刷新使能 /
    int cache_zc_en, / 接收零拷貝內存cache刷新使能 /
    int tx_buf_cnt, / 發送描述符數 /
    int rx_buf_cnt, / 接收描述符數 /
    int tx_zc_en, / 發送零拷貝使能 /
    int rx_zc_cnt) / 接收零拷貝池數 */
    可知,接收零拷貝是默認使能的,且零拷貝池數是接收描述符數的2倍即申請2倍空間(下文會對此分析)。創建流程如圖 2.1:

    圖 2.1 描述符助手創建
    這里需要關注的是,零拷貝池的每個節點大小是幀大小加上節點頭大小,幀對應pbuf空間,而實際數據的存儲則又是pbuf里的payload空間。關系如圖 2.2:

    圖 2.2 零拷貝池節點結構
  • 發送
    發送需要關注兩個函數,發送前prepare即將上層要發送的pbuf->payload關聯到發送描述符,發送后clean即是把該pbuf空間釋放掉。如圖 3.1:

    圖 3.1 發送流程
  • 接收
    接收同樣是關注兩個函數,接收前input取出內容,接收后refill重關聯描述符與零拷貝池。但多一個流程,初始化時先把零拷貝地址池關聯到接收描述符并寫入MAC控制器。如圖 4.1:

    圖 4.1 接收流程
    這里對為什么接收零拷貝池申請2倍內存做一個推測,由于其他空間是用完后即可再次利用,而接收描述符空間是要等上層歸還到零拷貝池鏈表后,當上層歸還不及時時,零拷貝池數量實際就沒申請的那么多,所以直接采取極端情形即申請2倍。
  • 總結

    以上是生活随笔為你收集整理的网卡驱动描述符助手功能浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。