摘 要:隨著飛騰處理器性能的提升,原來的網(wǎng)絡(luò)驅(qū)動(dòng)已經(jīng)不能滿足其需求,急需設(shè)計(jì)和實(shí)現(xiàn)一款針對(duì)當(dāng)前處理器的特性,能最大程度發(fā)揮其性能的網(wǎng)絡(luò)驅(qū)動(dòng)。通過研究飛騰處理器網(wǎng)絡(luò)控制器相關(guān)的硬件原理以及l(fā)inux下驅(qū)動(dòng)框架的知識(shí),設(shè)計(jì)和實(shí)現(xiàn)飛騰處理器中網(wǎng)絡(luò)控制器的驅(qū)動(dòng),并對(duì)其進(jìn)行了優(yōu)化,使其達(dá)到了千兆網(wǎng)卡的使用需求。
關(guān)鍵詞:飛騰處理器;linux驅(qū)動(dòng)框架;DMA;IP頭對(duì)齊;NAP;GSO
中圖分類號(hào):TP334.7
飛騰處理器是國防科大計(jì)算機(jī)學(xué)院研制的一款高性能通用服務(wù)器處理器。飛騰處理器芯片內(nèi)部集成了兩個(gè)千兆網(wǎng)絡(luò)控制器,通過高速AMBA總線與CPU系統(tǒng)總線互連。
本文研究了飛騰處理器網(wǎng)絡(luò)控制器相關(guān)的硬件原理以及l(fā)inux下驅(qū)動(dòng)框架知識(shí),設(shè)計(jì)和實(shí)現(xiàn)飛騰處理器中網(wǎng)絡(luò)控制器的驅(qū)動(dòng),并對(duì)其進(jìn)行了優(yōu)化,使其達(dá)到了千兆網(wǎng)卡的使用需求。
1 硬件原理
飛騰處理器網(wǎng)絡(luò)控制器器包括AHB/AXI接口,DMA通道,F(xiàn)IFO緩沖和核心四個(gè)邏輯部件。AHB/AXI接口通過AMBA總線控制器與系統(tǒng)總線互連,即可以作為從設(shè)備接收CPU的訪問操作,也可以作為主設(shè)備為DMA啟動(dòng)訪存操作;DMA通道負(fù)責(zé)通過AMBA總線在系統(tǒng)主存和內(nèi)部FIFO之間進(jìn)行數(shù)據(jù)包的傳輸;DMA通道和FIFO緩沖都是接收和發(fā)送專用的,因此一個(gè)網(wǎng)絡(luò)控制器包含兩個(gè)DMA通道和兩個(gè)FIFO緩沖;核心邏輯實(shí)現(xiàn)了千兆介質(zhì)無關(guān)接口GMII,并負(fù)責(zé)在FIFO緩沖區(qū)和GMII之間進(jìn)行數(shù)據(jù)包傳輸。
飛騰處理器通過GMII接口與物理層芯片連接,并通過介質(zhì)相關(guān)MD總線訪問物理層芯片的狀態(tài)和控制寄存器SCR。
2 網(wǎng)絡(luò)驅(qū)動(dòng)設(shè)計(jì)
linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)基本框架從上到下劃為三層,分別為網(wǎng)絡(luò)協(xié)議接口層,網(wǎng)絡(luò)設(shè)備接口層,設(shè)備驅(qū)動(dòng)功能層。
網(wǎng)絡(luò)協(xié)議接口層提供統(tǒng)一的數(shù)據(jù)包收發(fā)接口,使得上層ARP或IP協(xié)議獨(dú)立于具體的設(shè)備,通過dev_queue_xmit()函數(shù)發(fā)送數(shù)據(jù),并通過netif_rx()函數(shù)接收數(shù)據(jù)。
網(wǎng)絡(luò)接口層從宏觀上規(guī)劃了具體操作硬件的設(shè)備驅(qū)動(dòng)功能層的結(jié)構(gòu),網(wǎng)絡(luò)設(shè)備接口層提供統(tǒng)一的用于描述具體網(wǎng)絡(luò)設(shè)備屬性和操作的結(jié)構(gòu)體net_device,該結(jié)構(gòu)體是設(shè)備驅(qū)動(dòng)功能層中各函數(shù)的容器。
設(shè)備驅(qū)動(dòng)功能層各函數(shù)是網(wǎng)絡(luò)設(shè)備接口層net_device數(shù)據(jù)結(jié)構(gòu)的具體成員,是驅(qū)使網(wǎng)絡(luò)設(shè)備硬件完成相應(yīng)動(dòng)作的程序,它通過hard_start_xmit()函數(shù)啟動(dòng)發(fā)送操作,并通過網(wǎng)絡(luò)設(shè)備上的中斷觸發(fā)接受操作。
飛騰網(wǎng)絡(luò)控制器驅(qū)動(dòng)實(shí)現(xiàn)了linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)基本框架要求的函數(shù)接口,并在此基礎(chǔ)上進(jìn)行了一系列的優(yōu)化,主要技術(shù)難點(diǎn)在于資源尋址機(jī)制、鏈路狀態(tài)監(jiān)控和基于DMA的數(shù)據(jù)包收發(fā)機(jī)制的設(shè)計(jì)和實(shí)現(xiàn)。
2.1 資源尋址機(jī)制
資源尋址機(jī)制涉及到兩方面問題:一方面是飛騰CPU硬核對(duì)網(wǎng)絡(luò)控制和狀態(tài)寄存器CSR資源的尋址,另一方面是網(wǎng)絡(luò)控制器DMA對(duì)系統(tǒng)主存資源的尋址。
在飛騰處理器中,網(wǎng)絡(luò)CSR寄存器和所有其他AMBA總線設(shè)備的寄存器一樣,被固定在AMBA總線地址空間的一段范圍內(nèi)。網(wǎng)絡(luò)驅(qū)動(dòng)程序在硬件初始化之前,需要將這段AMBA總線地址范圍映射到飛騰CPU地址空間上,從而實(shí)現(xiàn)網(wǎng)絡(luò)CSR寄存器的尋址,并通過CSR寄存器中的MD地址和數(shù)據(jù)寄存器的編程,實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)物理層芯片內(nèi)部MD寄存器的訪問。
網(wǎng)絡(luò)控制器的DMA需要在系統(tǒng)主存和內(nèi)部FIFO緩沖之間進(jìn)行數(shù)據(jù)傳輸,因此DMA需要具有系統(tǒng)主存的訪問能力,也就是說,系統(tǒng)主存的部分或者全部可以映射到AMBA總線地址空間上。因?yàn)轱w騰處理器的AMBA總線長度為64位,所以整個(gè)系統(tǒng)主存都可以映射到AMBA總線地址空間上,但是,不能與任意CSR寄存器地址范圍重疊,例如8G內(nèi)存,在AMBA地址范圍為[0x84_0000_0000,0x84_FFFF_FFFF]。驅(qū)動(dòng)程序的硬件初始化部分,通過AMBA總線控制器完成系統(tǒng)主存到AMBA總線地址的映射,從而實(shí)現(xiàn)網(wǎng)絡(luò)控制器DMA對(duì)系統(tǒng)主存資源的尋址。
2.2 鏈路狀態(tài)監(jiān)控
飛騰處理器網(wǎng)絡(luò)控制器主要使用GMII提供的管理接口MDIO來實(shí)現(xiàn)對(duì)物理芯片的控制并收集其狀態(tài)信息。
管理接口有兩條信號(hào)線組成:MDC配置接口時(shí)鐘,最高速率可達(dá)8.3MHz,MDIO是管理數(shù)據(jù)的輸入輸出雙向接口,數(shù)據(jù)是與MDC時(shí)鐘同步的。
網(wǎng)絡(luò)控制器提供了兩個(gè)寄存器,分別為GMII地址寄存器和GMII數(shù)據(jù)寄存器,它將2位讀寫命令,5位PHY芯片的地址,5位PHY芯片的寄存器地址寫入GMII地址寄存器,在MDC時(shí)鐘的配合下,將命令寫入到GMII數(shù)據(jù)寄存器,來控制和管理PHY芯片,如TX/RX模式選擇、自動(dòng)協(xié)商控制、環(huán)回模式控制等;或從GMII數(shù)據(jù)寄存器中讀出PHY芯片的狀態(tài)信息,包括鏈接狀態(tài)、傳輸速度、斷電、低功率休眠狀態(tài)等,實(shí)現(xiàn)對(duì)PHY芯片狀態(tài)的監(jiān)控。
2.3 基于DMA的數(shù)據(jù)包收發(fā)
DMA描述符是由16個(gè)字節(jié)組成,4個(gè)字節(jié)一組,將這4組分別標(biāo)識(shí)為DES0,DES1,DES2,DES3。
DES0是前4字節(jié),具體為1位OWN位(用來標(biāo)識(shí)描述符屬于DMA還是HOST)和31位的描述符狀態(tài)位;
DES1具體為10位控制位和兩個(gè)11位分別用來標(biāo)識(shí)緩沖區(qū)1和緩沖區(qū)2的大小。
DES2和DES3分別為緩沖區(qū)1和2的地址,盡管有兩個(gè)緩沖區(qū)可供使用,但我們這里只使用緩沖區(qū)1,即:DES2指向的緩沖區(qū)。
對(duì)于接收,驅(qū)動(dòng)在系統(tǒng)主存中維護(hù)一個(gè)由256個(gè)描述符組成的接收描述符數(shù)組,驅(qū)動(dòng)申請(qǐng)對(duì)應(yīng)的256個(gè)2K字節(jié)大小的skb緩沖區(qū),并將這些緩沖區(qū)進(jìn)行DMA流式映射,將生成的DMA地址填寫到對(duì)應(yīng)描述符的緩沖區(qū)地址字段,并將接收描述符數(shù)組的起始地址寫入DAM接收描述符表基址寄存器中。
當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包經(jīng)過PHY芯片的接收進(jìn)入到網(wǎng)絡(luò)控制器的接收FIFO時(shí),網(wǎng)絡(luò)控制器會(huì)自動(dòng)從AHB/AXI接口發(fā)起DMA操作,從DMA接收描述符表基址寄存器中或者從當(dāng)前接收描述符寄存器中讀取當(dāng)前描述符的DMA地址,訪問系統(tǒng)主存,獲取當(dāng)前描述符DES2字段指向的skb緩沖區(qū)的地址,將網(wǎng)絡(luò)控制器內(nèi)部的接收FIFO中的數(shù)據(jù)DMA到系統(tǒng)主存的緩沖區(qū)中,最后將接收狀態(tài)寫入對(duì)應(yīng)的接收描述符中DES0狀態(tài)字段,將接收到的數(shù)據(jù)包的長度等信息寫入對(duì)應(yīng)的接收描述符的DES1的對(duì)應(yīng)字段中,并產(chǎn)生接收中斷。內(nèi)核調(diào)用對(duì)應(yīng)的中斷處理程序,使用輪詢的方式進(jìn)行收包,并將數(shù)據(jù)包提交給上層協(xié)議棧。
對(duì)于發(fā)送,驅(qū)動(dòng)在系統(tǒng)主存中維護(hù)了一個(gè)256個(gè)描述符組成的發(fā)送描述符數(shù)組,并將發(fā)送描述符數(shù)組的起始地址寫入DAM發(fā)送描述符表基址寄存器中。當(dāng)應(yīng)用程序要發(fā)送數(shù)據(jù)時(shí),上層協(xié)議棧會(huì)向驅(qū)動(dòng)傳遞要發(fā)送的skb緩沖區(qū),將skb緩沖區(qū)進(jìn)行DMA流式映射,并將生成的DMA地址填寫在當(dāng)前發(fā)送描述符的DES2緩沖區(qū)地址字段,根據(jù)skb的相關(guān)成員變量,填寫對(duì)應(yīng)描述符的DES1的校驗(yàn)和字段以及緩沖區(qū)大小字段等。最后,寫DMA發(fā)送輪詢寄存器,將喚醒發(fā)送DMA,使其進(jìn)入運(yùn)行狀態(tài)。
當(dāng)發(fā)送DMA進(jìn)入運(yùn)行狀態(tài),DMA將從DMA發(fā)送描述符表基址寄存器或者當(dāng)前發(fā)送描述符寄存器中獲取當(dāng)前描述符的DMA地址,訪問系統(tǒng)主存,獲取當(dāng)前描述符DES2字段指向的skb緩沖區(qū)的地址,將緩沖區(qū)中的數(shù)據(jù)DMA到網(wǎng)絡(luò)控制器的發(fā)送FIFO中,并通過PHY收發(fā)器將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。
3 網(wǎng)絡(luò)驅(qū)動(dòng)優(yōu)化技術(shù)
網(wǎng)絡(luò)驅(qū)動(dòng)優(yōu)化技術(shù)有:IP報(bào)文頭部對(duì)齊,NAPI,GSO,DMA分散聚集等。
在飛騰處理器平臺(tái)上,重點(diǎn)介紹三點(diǎn)。
3.1 IP報(bào)文頭對(duì)齊對(duì)齊
在接收過程中,驅(qū)動(dòng)向內(nèi)核申請(qǐng)skb緩沖區(qū)后,需要調(diào)用skb_reserve(skb,2),使得skb->data向后移動(dòng)兩個(gè)字節(jié),因?yàn)閙ac頭長度是14個(gè)字節(jié),skb->data前面空置的2個(gè)字節(jié)加上mac頭長度正好是16個(gè)字節(jié),使得接下來的IP報(bào)文的起始地址是4字節(jié)地址對(duì)齊,這樣做使得內(nèi)核在后續(xù)對(duì)IP報(bào)文訪問時(shí)使用了對(duì)齊的地址,減少了很多的數(shù)據(jù)拷貝,提高了性能。但這樣做,會(huì)使得對(duì)緩沖區(qū)數(shù)據(jù)進(jìn)行DMA流式映射時(shí)生成的DMA地址不對(duì)齊,可能會(huì)對(duì)DMA操作產(chǎn)生影響,但此款網(wǎng)卡適配器的DMA對(duì)緩沖區(qū)的地址對(duì)齊沒有很嚴(yán)格的要求,通過硬件處理將性能的降低減到了最小,故采用IP報(bào)文頭對(duì)齊,在這點(diǎn)上對(duì)于網(wǎng)絡(luò)性能的提高是很顯著的。
3.2 NAPI技術(shù)
對(duì)于高速網(wǎng)絡(luò)設(shè)備而言,單純采用中斷驅(qū)動(dòng)的方式,CPU可能在短時(shí)間內(nèi)接收到大量密集的網(wǎng)絡(luò)數(shù)據(jù)包,如果每一個(gè)進(jìn)入的數(shù)據(jù)包都向CPU產(chǎn)生一次中斷請(qǐng)求,對(duì)這些請(qǐng)求的單獨(dú)處理無疑會(huì)造成CPU資源的浪費(fèi)甚至導(dǎo)致系統(tǒng)癱瘓。
NAPI的設(shè)計(jì)思想是使用中斷和輪詢相結(jié)合的方式接收數(shù)據(jù)包,發(fā)揮各自的優(yōu)勢。當(dāng)有數(shù)據(jù)包到達(dá)觸發(fā)中斷,在中斷處理程序中調(diào)用_stmmac_schedule()函數(shù)關(guān)閉接收中斷,系統(tǒng)對(duì)數(shù)據(jù)包的接收進(jìn)入輪詢模式,調(diào)用輪詢函數(shù)接收數(shù)據(jù)包。在輪詢函數(shù)中,設(shè)置了一個(gè)接收數(shù)據(jù)包的閥值,每次輪詢函數(shù)接收到數(shù)據(jù)包達(dá)到這個(gè)閥值時(shí),輪詢函數(shù)將返回,等待下一次的輪詢。當(dāng)一次輪詢接收的數(shù)據(jù)包小于這個(gè)閥值,退出輪詢收包模式,開啟接收中斷,進(jìn)入中斷收包模式。NAPI通過輪詢期間關(guān)閉中斷,實(shí)現(xiàn)了中斷緩和,減少了內(nèi)核處理中斷的壓力,變相提高了性能。
3.3 GSO技術(shù)
TSO(TCP Segmentation Offload)是一種利用網(wǎng)卡分割大數(shù)據(jù)包,減小CPU負(fù)荷的一種技術(shù),也被叫做LSO(Large segment offload),如果數(shù)據(jù)包的類型只能是TCP,則被稱之為TSO。
TSO是使得網(wǎng)絡(luò)協(xié)議棧能夠?qū)⒋髩K buffer 推送至網(wǎng)卡,然后網(wǎng)卡執(zhí)行分片工作,這樣減輕了CPU的負(fù)荷,但TSO需要硬件來實(shí)現(xiàn)分片功能;而性能上的提高,主要是因?yàn)檠泳彿制鴾p輕了CPU的負(fù)載,因此,可以考慮將TSO技術(shù)一般化,因?yàn)槠浔举|(zhì)實(shí)際是延緩分片,這種技術(shù),在Linux中被叫做GSO(Generic Segmentation Offload),它比TSO更通用,原因在于它不需要硬件的支持分片就可使用,通過將分片的執(zhí)行,放在將數(shù)據(jù)推送的網(wǎng)卡的前一刻,也就是在調(diào)用驅(qū)動(dòng)的stmmac_xmit函數(shù)前,達(dá)到延緩分片的目的,最終提高了性能。
4 測試
硬件環(huán)境:FT1000A采用內(nèi)置網(wǎng)卡與X86機(jī)器的BCM57780網(wǎng)卡互連。
軟件環(huán)境:測試工具為iperf。
由測試結(jié)果可得:新設(shè)計(jì)的驅(qū)動(dòng)較之前的驅(qū)動(dòng)在接收和發(fā)送數(shù)據(jù)的速率上有很大的提升,其中IP報(bào)文頭部對(duì)齊對(duì)TCP/UDP接收性能有較大提升,但由于IP報(bào)文頭對(duì)齊導(dǎo)致的DMA地址不對(duì)齊造成了一定的性能損失,接收的性能離千兆的性能還有差距;GSO功能對(duì)TCP發(fā)送性能有大幅度提升;UDP發(fā)送速率,峰值原本已經(jīng)接近X86上千兆網(wǎng)卡性能。
5 結(jié)束語
本文詳細(xì)闡述了國產(chǎn)飛騰處理器SOC網(wǎng)絡(luò)適配器驅(qū)動(dòng)的設(shè)計(jì)實(shí)現(xiàn)以及對(duì)其進(jìn)行的優(yōu)化,雖然網(wǎng)卡在此驅(qū)動(dòng)程序的驅(qū)動(dòng)下,網(wǎng)絡(luò)性能已經(jīng)幾乎達(dá)到了千兆網(wǎng)絡(luò)性能要求,但與X86千兆網(wǎng)卡的網(wǎng)絡(luò)性能還是有差距的,希望通過后續(xù)學(xué)習(xí)和研究,能進(jìn)一步提升國產(chǎn)飛騰處理器平臺(tái)的網(wǎng)絡(luò)性能。
參考文獻(xiàn):
[1]博韋,西斯特等.深入理解linux內(nèi)核(第三版)[M].北京:中國電力出版社,2007.
[2]宋寶華.linux設(shè)備驅(qū)動(dòng)開發(fā)詳解[M].北京:人民郵電出版社,2010:364-369.
[3]曹桂平等.linux內(nèi)核網(wǎng)絡(luò)棧源代碼情景分析[M].北京:人民郵電出版社,2010.
[4]莫爾勒,郭旭等.深入Linux內(nèi)核架構(gòu)[M].北京:人民郵電出版社,2010.
[5]科波特,魏永明等.LINUX設(shè)備驅(qū)動(dòng)程序(第3版)[M].北京:中國電力出版社,2006.
[6]拉芙,陳莉君等.Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)[M].北京:機(jī)械工業(yè)出版社,2011.
[7]趙軍.linux下網(wǎng)絡(luò)性能優(yōu)化方法解析[EB/OL].http://www.ibm.com/developerworks/cn/linux/l-cn-network-pt/,[2010-11-25/2013-07-22]
[8]馮國進(jìn).linux驅(qū)動(dòng)程序開發(fā)實(shí)例[M].北京:機(jī)械工業(yè)出版社,2011.
[9]宋敬彬,孫海濱.linux網(wǎng)絡(luò)編程[M].北京:清華大學(xué)出版社,2010.
[10]劉衛(wèi)軍.網(wǎng)絡(luò)性能優(yōu)化(NAPI)[EB/OL].http://blog.csdn.net/ustc_dylan/article/details/6116336,[2011-01-04/2013-07-22].
作者簡介:周浩(1988.07.05-),男,山西晉中人,碩士,在讀學(xué)生,研究方向:操作系統(tǒng)。
作者單位:國防科學(xué)技術(shù)大學(xué)計(jì)算機(jī)學(xué)院,長沙 410073