网卡驱动描述符助手功能浅析
生活随笔
收集整理的這篇文章主要介紹了
网卡驱动描述符助手功能浅析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
網(wǎng)卡驅動里,CPU和MAC控制器都需要對DMA描述符空間進行讀取或者寫入。DMA描述符空間又會采用到CACHE和零拷貝技術,以往都是驅動自己去申請、關聯(lián)內存和刷新(flush和invalidate)CACHE。
描述符助手則是把這些工作在內核里完成,對驅動提供接口即可,此文就對這些接口功能做一些分析。
實現(xiàn)發(fā)送靜態(tài)內存空間申請、發(fā)送零拷貝內存創(chuàng)建(但不申請空間)、接收靜態(tài)內存空間申請、接收零拷貝內存空間申請,及CACHE刷新。函數(shù)原型及入?yún)⑷绯绦蚯鍐?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, / 發(fā)送靜態(tài)內存cache刷新使能 /
int cache_rs_en, / 接收靜態(tài)內存cache刷新使能 /
int cache_zc_en, / 接收零拷貝內存cache刷新使能 /
int tx_buf_cnt, / 發(fā)送描述符數(shù) /
int rx_buf_cnt, / 接收描述符數(shù) /
int tx_zc_en, / 發(fā)送零拷貝使能 /
int rx_zc_cnt) / 接收零拷貝池數(shù) */
可知,接收零拷貝是默認使能的,且零拷貝池數(shù)是接收描述符數(shù)的2倍即申請2倍空間(下文會對此分析)。創(chuàng)建流程如圖 2.1:
圖 2.1 描述符助手創(chuàng)建
這里需要關注的是,零拷貝池的每個節(jié)點大小是幀大小加上節(jié)點頭大小,幀對應pbuf空間,而實際數(shù)據(jù)的存儲則又是pbuf里的payload空間。關系如圖 2.2:
圖 2.2 零拷貝池節(jié)點結構
發(fā)送需要關注兩個函數(shù),發(fā)送前prepare即將上層要發(fā)送的pbuf->payload關聯(lián)到發(fā)送描述符,發(fā)送后clean即是把該pbuf空間釋放掉。如圖 3.1:
圖 3.1 發(fā)送流程
接收同樣是關注兩個函數(shù),接收前input取出內容,接收后refill重關聯(lián)描述符與零拷貝池。但多一個流程,初始化時先把零拷貝地址池關聯(lián)到接收描述符并寫入MAC控制器。如圖 4.1:
圖 4.1 接收流程
這里對為什么接收零拷貝池申請2倍內存做一個推測,由于其他空間是用完后即可再次利用,而接收描述符空間是要等上層歸還到零拷貝池鏈表后,當上層歸還不及時時,零拷貝池數(shù)量實際就沒申請的那么多,所以直接采取極端情形即申請2倍。
總結
以上是生活随笔為你收集整理的网卡驱动描述符助手功能浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NIST《零信任安全架构标准》简单解读
- 下一篇: 2015年2月8日工作日志------赵