网卡驱动描述符助手功能浅析
生活随笔
收集整理的這篇文章主要介紹了
网卡驱动描述符助手功能浅析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網卡驅動里,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倍。
總結
以上是生活随笔為你收集整理的网卡驱动描述符助手功能浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NIST《零信任安全架构标准》简单解读
- 下一篇: 2015年2月8日工作日志------赵