一種arm網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法和系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法和系統(tǒng),所述方法包括:去除內(nèi)核態(tài)中ARM網(wǎng)口初始化函數(shù);將去除的所述ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài);用戶態(tài)從內(nèi)核態(tài)中獲取大塊連續(xù)內(nèi)存,并對(duì)所述大塊連續(xù)內(nèi)存進(jìn)行單獨(dú)管理;用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大??;用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)進(jìn)行ARM網(wǎng)口驅(qū)動(dòng)加載,通過所述大塊連續(xù)內(nèi)存實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和釋放,收發(fā)報(bào)文。本發(fā)明將ARM網(wǎng)口的驅(qū)動(dòng)加載以及網(wǎng)絡(luò)數(shù)據(jù)報(bào)文的處理均放在用戶態(tài),消除了內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,優(yōu)化了CPU性能。
【專利說明】—種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法和系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計(jì)算機(jī)網(wǎng)絡(luò)【技術(shù)領(lǐng)域】,具體涉及一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法和系統(tǒng)。
【背景技術(shù)】
[0002]ARM CPU多為內(nèi)核驅(qū)動(dòng),網(wǎng)口初始化與收發(fā)報(bào)文都部署在內(nèi)核態(tài),這樣在數(shù)據(jù)報(bào)文大流量的沖擊下會(huì)引發(fā)大量程序的中斷,導(dǎo)致CPU資源的額外消耗。同時(shí),操作系統(tǒng)的內(nèi)核態(tài)到用戶態(tài)的數(shù)據(jù)拷貝也會(huì)損耗大量的CPU性能。另外,內(nèi)核調(diào)試手段也相對(duì)缺乏,較之用戶態(tài)相比開發(fā)效率低下。
[0003]ARM CPU的內(nèi)核態(tài)承載了過多驅(qū)動(dòng)加載、報(bào)文處理,使得ARM在內(nèi)核態(tài)下工作效率低下;同時(shí),ARM在內(nèi)核態(tài)下的調(diào)試手段也有很大的局限性,使得ARM在內(nèi)核態(tài)下工作效率很難提聞。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的是提供一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法和系統(tǒng),將ARM網(wǎng)口的驅(qū)動(dòng)加載以及網(wǎng)絡(luò)數(shù)據(jù)報(bào)文的處理均放在用戶態(tài),消除了內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,以解決使用內(nèi)核態(tài)驅(qū)動(dòng)加載ARM網(wǎng)口以及收發(fā)報(bào)文導(dǎo)致?lián)p耗大量CPU性能,優(yōu)化CPU性能。
[0005]根據(jù)本發(fā)明的一個(gè)方面,提供一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法,所述方法包括以下步驟:步驟SI,去除內(nèi)核態(tài)中ARM網(wǎng)口初始化函數(shù);步驟S2,將去除的所述ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài);步驟S3,用戶態(tài)從內(nèi)核態(tài)中獲取大塊連續(xù)內(nèi)存,并對(duì)所述大塊連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,使得用戶態(tài)具有訪問DMA內(nèi)存的權(quán)限;步驟S4,用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小,使得用戶態(tài)具有讀寫ARM網(wǎng)口的硬件寄存器的權(quán)限;步驟S5,用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)進(jìn)行ARM網(wǎng)口驅(qū)動(dòng)加載,通過所述大塊連續(xù)內(nèi)存實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和釋放,收發(fā)報(bào)文。
[0006]其中,在本發(fā)明中,所述步驟S2進(jìn)一步包括:步驟S21,將與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)移植到用戶態(tài);步驟S22,對(duì)用戶態(tài)中植入的與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)進(jìn)行整改,去掉用戶態(tài)不需要的操作;步驟S23,創(chuàng)建線程進(jìn)行收包,將整改后的所述函數(shù)編譯鏈接生成可執(zhí)行程序。
[0007]其中,在本發(fā)明中,所述步驟S3進(jìn)一步包括:步驟S31,在內(nèi)核態(tài)初始化時(shí),利用大塊內(nèi)存申請(qǐng)補(bǔ)丁 Bigphysarea申請(qǐng)大塊連續(xù)內(nèi)存,以備用戶態(tài)收發(fā)報(bào)文申請(qǐng)數(shù)據(jù)結(jié)構(gòu)skb使用;步驟S32,用戶態(tài)通過管理函數(shù)1ctl方式從內(nèi)核態(tài)獲取已申請(qǐng)的所述大塊連續(xù)內(nèi)存的地址和大??;步驟S33,采用_ap函數(shù)將所述大塊連續(xù)內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址。
[0008]其中,在本發(fā)明中,所述步驟S4進(jìn)一步包括:步驟S41,用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小;步驟S42,用戶態(tài)將獲取的所述硬件寄存器的物理基地址及寄存器空間的大小定義為宏,通過mmap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址。
[0009]其中,在本發(fā)明中,所述步驟S5進(jìn)一步包括:用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)并加載驅(qū)動(dòng)后,分配收發(fā)資源,通過控制寄存器的配置、接口注冊(cè)及收發(fā)函數(shù)掛載,實(shí)現(xiàn)收發(fā)報(bào)文。
[0010]根據(jù)本發(fā)明的另一方面,提供一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植系統(tǒng),所述系統(tǒng)包括:去除單元,用于去除內(nèi)核態(tài)中ARM網(wǎng)口初始化函數(shù);移植單元,用于將所述去除單元去除的ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài);內(nèi)存獲取單元,用于從內(nèi)核態(tài)中獲取大塊連續(xù)內(nèi)存,并對(duì)所述大塊連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,使得用戶態(tài)具有訪問DMA內(nèi)存權(quán)限;硬件寄存器獲取單元,用于通過用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小,使得用戶態(tài)具有讀寫ARM網(wǎng)口的硬件寄存器的權(quán)限;執(zhí)行單元,用于執(zhí)行ARM網(wǎng)口的初始化函數(shù)進(jìn)行ARM網(wǎng)口驅(qū)動(dòng)加載,通過所述大塊連續(xù)內(nèi)存實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和釋放,收發(fā)報(bào)文。
[0011]其中,在本發(fā)明中,所述移植單元包括移植模塊、整改模塊和收包模塊;所述移植模塊用于將與ARM網(wǎng)口驅(qū)動(dòng)相關(guān)的函數(shù)移植到用戶態(tài);所述整改模塊用于對(duì)用戶態(tài)中植入的與ARM網(wǎng)口驅(qū)動(dòng)相關(guān)的函數(shù)進(jìn)行整改,去掉用戶態(tài)不需要的操作函數(shù);所述收包模塊用于創(chuàng)建線程進(jìn)行收包,并將整改后的所述函數(shù)編譯鏈接生成可執(zhí)行程序。
[0012]其中,在本發(fā)明中,所述內(nèi)存獲取單元包括內(nèi)存申請(qǐng)模塊、內(nèi)存地址獲取模塊和內(nèi)存地址映射模塊;所述內(nèi)存申請(qǐng)模塊用于內(nèi)核態(tài)初始化時(shí),利用Bigphysarea申請(qǐng)大塊連續(xù)內(nèi)存,以備用戶態(tài)收發(fā)報(bào)文申請(qǐng)skb使用;所述內(nèi)存地址獲取模塊用于通過1ctl方式從內(nèi)核態(tài)獲取已申請(qǐng)的所述大塊連續(xù)內(nèi)存的地址和大?。凰鰞?nèi)存地址映射模塊用于采用mmap函數(shù)將所述大塊連續(xù)內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址。
[0013]其中,在本發(fā)明中,所述硬件寄存器獲取單元包括硬件寄存器地址獲取模塊和硬件寄存器地址映射模塊;所述硬件寄存器地址獲取模塊用于通過用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小;所述硬件寄存器地址映射模塊用于將獲取的所述硬件寄存器的物理基地址及寄存器空間的大小定義為宏,通過_ap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址。
[0014]其中,在本發(fā)明中,所述執(zhí)行單元進(jìn)一步用于在用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)并加載驅(qū)動(dòng)后,分配收發(fā)資源,通過控制寄存器的配置、接口注冊(cè)及收發(fā)函數(shù)掛載,實(shí)現(xiàn)用戶態(tài)收發(fā)報(bào)文。
[0015]根據(jù)本發(fā)明的一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法和系統(tǒng),將ARM網(wǎng)口的驅(qū)動(dòng)加載以及網(wǎng)絡(luò)數(shù)據(jù)報(bào)文的處理均放在用戶態(tài),消除了內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,降低了 CPU性能的消耗,優(yōu)化了 CPU性能;另外,用戶態(tài)驅(qū)動(dòng)具有強(qiáng)悍的調(diào)試能力,能將驅(qū)動(dòng)開發(fā)人員在操作系統(tǒng)繁瑣的調(diào)試作業(yè)中解放出來,進(jìn)一步提高了開發(fā)效率。
【專利附圖】
【附圖說明】
[0016]圖1顯示了本發(fā)明的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植的原理圖;
[0017]圖2顯示了本發(fā)明優(yōu)選實(shí)施例的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法的流程圖;
[0018]圖3顯示了圖2中步驟S2的子流程圖;
[0019]圖4顯示了圖2中步驟S3的子流程圖;
[0020]圖5顯示了圖2中步驟S4的子流程圖;
[0021]圖6顯示了本發(fā)明優(yōu)選實(shí)施例的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植系統(tǒng)的結(jié)構(gòu)示意圖;
[0022]圖7顯示了本發(fā)明優(yōu)選實(shí)施例的移植單元的結(jié)構(gòu)示意圖;
[0023]圖8顯示了本發(fā)明優(yōu)選實(shí)施例的內(nèi)存獲取單元的結(jié)構(gòu)示意圖;
[0024]圖9顯示了本發(fā)明優(yōu)選實(shí)施例的硬件寄存器獲取單元的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0025]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明了,下面結(jié)合【具體實(shí)施方式】并參照附圖,對(duì)本發(fā)明進(jìn)一步詳細(xì)說明。應(yīng)該理解,這些描述只是示例性的,而并非要限制本發(fā)明的范圍。此外,在以下說明中,省略了對(duì)公知結(jié)構(gòu)和技術(shù)的描述,以避免不必要地混淆本發(fā)明的概念。
[0026]圖1顯示了本發(fā)明的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植的原理圖。
[0027]如圖1所示,在本發(fā)明中,去掉內(nèi)核中ARM網(wǎng)口的初始化函數(shù),將ARM網(wǎng)口初始化函數(shù)中ARM網(wǎng)口的驅(qū)動(dòng)加載以及網(wǎng)絡(luò)數(shù)據(jù)報(bào)文的處理均放在用戶態(tài),使得內(nèi)核不再處理網(wǎng)口加載和收發(fā)報(bào)文,而直接由用戶態(tài)驅(qū)動(dòng)網(wǎng)口和收發(fā)報(bào)文,消除了內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,降低了 CPU性能的損耗。
[0028]圖2顯示了本發(fā)明優(yōu)選實(shí)施例的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法的流程圖;圖3顯示了圖2中步驟S2的子流程圖;圖4顯示了圖2中步驟S3的子流程圖;圖5顯示了圖2中步驟S4的子流程圖。
[0029]如圖2所示,本發(fā)明優(yōu)選實(shí)施例的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法,包括以下步驟:
[0030]步驟SI,去除內(nèi)核中ARM網(wǎng)口初始化函數(shù)。
[0031]一般地,ARM CPU多為內(nèi)核驅(qū)動(dòng),網(wǎng)口初始化與收發(fā)報(bào)文都部署在內(nèi)核態(tài),使得操作系統(tǒng)通過內(nèi)核態(tài)來收發(fā)報(bào)文,再將報(bào)文拷貝至用戶態(tài)。在步驟SI中,將操作系統(tǒng)內(nèi)核中ARM網(wǎng)口初始化函數(shù)去掉,此時(shí),內(nèi)核不再用于網(wǎng)卡驅(qū)動(dòng)及收發(fā)包處理,即內(nèi)核不再初始化及掛載ARM網(wǎng)口的任何處理函數(shù),不再使用中斷收發(fā)報(bào)文,相關(guān)操作都在用戶態(tài)進(jìn)行。這里的操作系統(tǒng)可以是Linux操作系統(tǒng),也可以是windows操作系統(tǒng)或其他操作系統(tǒng)。
[0032]步驟S2,將去除的所述ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài)。
[0033]本步驟將內(nèi)核中的ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài)網(wǎng)口,使得用戶態(tài)直接驅(qū)動(dòng)網(wǎng)口并收發(fā)報(bào)文,消除內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,降低CPU性能的消耗。
[0034]其中,步驟S2如圖3所示,包括下述子步驟:
[0035]步驟S21,將與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)移植到用戶態(tài)。即將內(nèi)核中的與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)移植到用戶態(tài)。
[0036]步驟S22,對(duì)用戶態(tài)中植入的與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)進(jìn)行整改,去掉用戶態(tài)不需要的操作。并不是將所有與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)都保留在用戶態(tài)網(wǎng)口,而是為了在提高系統(tǒng)轉(zhuǎn)發(fā)性能的同時(shí)盡量減小CPU性能的消耗,將一些用戶態(tài)不需要的操作去掉,例如CPU控制等是用戶態(tài)所不需要的操作,因此可以去掉。
[0037]步驟S23,創(chuàng)建線程進(jìn)行收包,將整改后的所述函數(shù)編譯鏈接生成可執(zhí)行程序。具體來說,創(chuàng)建線程采用輪詢方式進(jìn)行收包,編譯鏈接生成可執(zhí)行程序。
[0038]步驟S3,用戶態(tài)從內(nèi)核態(tài)中獲取大塊連續(xù)內(nèi)存,并對(duì)所述大塊連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,使得用戶態(tài)具有訪問DMA內(nèi)存的權(quán)限。
[0039]具體來說,步驟S3如圖4所示,包括下述子步驟:
[0040]步驟S31,在內(nèi)核態(tài)初始化時(shí),利用Bigphysarea申請(qǐng)大塊連續(xù)內(nèi)存,以備用戶態(tài)收發(fā)報(bào)文申請(qǐng)skb使用。其中,skb是標(biāo)識(shí)報(bào)文的一個(gè)數(shù)據(jù)結(jié)構(gòu),包括報(bào)文頭、數(shù)據(jù)段等,內(nèi)核的所有業(yè)務(wù)處理都基于skb數(shù)據(jù)結(jié)構(gòu)完成。Bigphysarea為大塊內(nèi)存申請(qǐng)的補(bǔ)丁,可以有效地解決操作系統(tǒng)無法申請(qǐng)大塊連續(xù)內(nèi)存的問題。在步驟S31中,優(yōu)選地,向內(nèi)核態(tài)申請(qǐng)大小為300M的連續(xù)內(nèi)存,當(dāng)然所要申請(qǐng)的連續(xù)內(nèi)存的大小可以根據(jù)操作系統(tǒng)總內(nèi)存的大小自行定義,如果總內(nèi)存越大,相應(yīng)地可以申請(qǐng)更大的連續(xù)內(nèi)存,反之要減小所要申請(qǐng)的連續(xù)內(nèi)存的大小。
[0041]步驟S32,用戶態(tài)通過1ctl方式從內(nèi)核態(tài)獲取已申請(qǐng)的所述大塊連續(xù)內(nèi)存的地址和大小。其中1ctl是設(shè)備驅(qū)動(dòng)程序中對(duì)設(shè)備的I/O通道進(jìn)行管理的函數(shù),可用于用戶態(tài)和內(nèi)核態(tài)間通信。具體地,在本步驟中,通過1ctl方式對(duì)申請(qǐng)的內(nèi)存進(jìn)行檢測,檢測出該內(nèi)存的地址和大小,如果檢測到地址和大小相符,則進(jìn)行獲取。
[0042]步驟S33,采用_ap函數(shù)將所述大塊連續(xù)內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址。收發(fā)報(bào)文使用的skb申請(qǐng)和釋放可以在映射后的這塊內(nèi)存中進(jìn)行。
[0043]在步驟S33中,完成地址的映射操作,將步驟S31中申請(qǐng)到的內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址,使得用戶態(tài)可以對(duì)這塊物理連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,以實(shí)現(xiàn)用戶態(tài)具有訪問DMA內(nèi)存的權(quán)限。
[0044]步驟S4,用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小,使得用戶態(tài)具有讀寫ARM網(wǎng)口的硬件寄存器的權(quán)限。
[0045]具體來說,步驟S4如圖5所示,包括下述子步驟:
[0046]步驟S41,用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小。
[0047]步驟S42,用戶態(tài)將獲取的所述硬件寄存器的物理基地址及寄存器空間的大小定義為宏,通過_ap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址。
[0048]通過步驟S41和步驟S42的流程,用戶態(tài)先獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間的大小,再使用_ap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址,使得用戶態(tài)可以對(duì)ARM網(wǎng)口的硬件寄存器進(jìn)行管理,使得用戶態(tài)可以讀寫ARM網(wǎng)口的硬件控制寄存器。
[0049]步驟S5,用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)進(jìn)行ARM網(wǎng)口驅(qū)動(dòng)加載,通過所述大塊連續(xù)內(nèi)存實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和釋放,收發(fā)報(bào)文。
[0050]在步驟S5中,用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù),該執(zhí)行過程和內(nèi)核執(zhí)行過程相似,在所有與ARM網(wǎng)口驅(qū)動(dòng)及收發(fā)相關(guān)的操作中都需執(zhí)行。具體地,用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)并加載驅(qū)動(dòng)后,分配收發(fā)資源,控制寄存器的配置、接口注冊(cè)及收發(fā)函數(shù)掛載,實(shí)現(xiàn)用戶態(tài)收發(fā)報(bào)文。其中分配收發(fā)的資源包括隊(duì)列、描述符、buffer緩存等。
[0051]通過采用上述流程,先采用Bigphysarea申請(qǐng)大塊連續(xù)內(nèi)存,然后采用mmap函數(shù)將申請(qǐng)的內(nèi)存的物理基地址映射為用戶態(tài)虛擬地址,使得用戶態(tài)可以訪問到DMA的內(nèi)存,并且在用戶態(tài)進(jìn)行ARM網(wǎng)口的驅(qū)動(dòng)初始化及相關(guān)硬件控制寄存器的配置,實(shí)現(xiàn)了用戶態(tài)驅(qū)動(dòng)ARM網(wǎng)口以及收發(fā)報(bào)文,消除了內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,進(jìn)而提高了設(shè)備的轉(zhuǎn)發(fā)性能,優(yōu)化了 CPU性能。
[0052]圖6顯示了本發(fā)明優(yōu)選實(shí)施例的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植系統(tǒng)的結(jié)構(gòu)示意圖;圖7顯示了本發(fā)明優(yōu)選實(shí)施例的移植單元的結(jié)構(gòu)示意圖;圖8顯示了本發(fā)明優(yōu)選實(shí)施例的內(nèi)存獲取單元的結(jié)構(gòu)示意圖;圖9顯示了本發(fā)明優(yōu)選實(shí)施例的硬件寄存器獲取單元的結(jié)構(gòu)示意圖。
[0053]如圖6所示,本發(fā)明優(yōu)選實(shí)施例的ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植系統(tǒng),包括以下部件:去除單元1、移植單元2、內(nèi)存獲取單元3、硬件寄存器獲取單元4以及執(zhí)行單元5。
[0054]去除單元1,連接到內(nèi)核態(tài),用于去除內(nèi)核態(tài)中ARM網(wǎng)口初始化函數(shù)。一般地,ARMCPU多為內(nèi)核驅(qū)動(dòng),網(wǎng)口初始化與收發(fā)報(bào)文都部署在內(nèi)核態(tài),使得操作系統(tǒng)通過內(nèi)核態(tài)來收發(fā)報(bào)文,再將報(bào)文拷貝至用戶態(tài)。本發(fā)明中,去除單元I將操作系統(tǒng)內(nèi)核中ARM網(wǎng)口初始化函數(shù)去掉,使得內(nèi)核不再用于網(wǎng)卡驅(qū)動(dòng)及收發(fā)報(bào)文處理,即內(nèi)核不再初始化及掛載ARM網(wǎng)口的任何處理函數(shù),不再使用中斷收發(fā)報(bào)文,相關(guān)操作都在用戶態(tài)進(jìn)行。
[0055]這里的操作系統(tǒng)可以是Linux操作系統(tǒng),也可以是windows操作系統(tǒng)或其他操作系統(tǒng)。
[0056]移植單元2,連接到去除單元I和用戶態(tài),用于將去除單元I去除的ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài)網(wǎng)口。具體地,移植單元2將內(nèi)核中的ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài)網(wǎng)口,使得用戶態(tài)直接驅(qū)動(dòng)網(wǎng)口并收發(fā)報(bào)文,消除內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,降低CPU性能的消耗,提高設(shè)備的轉(zhuǎn)發(fā)性能。
[0057]其中,移植單元2的結(jié)構(gòu)如圖7所示,包括移植模塊21、整改模塊22和收包模塊23。
[0058]移植模塊21,用于將與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)移植到用戶態(tài)網(wǎng)口,即移植模塊21將內(nèi)核中的與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)移植到用戶態(tài)網(wǎng)口。
[0059]整改模塊22,對(duì)用戶態(tài)中植入的與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)進(jìn)行整改,去掉用戶態(tài)不需要的操作。并不是將所有與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的處理函數(shù)都保留在用戶態(tài),而是為了在提高系統(tǒng)轉(zhuǎn)發(fā)性能的同時(shí)盡量減小CPU性能的消耗,整改模塊22將一些用戶態(tài)不需要的操作去掉,例如CPU控制等是用戶態(tài)所不需要的操作,因此可以去掉。
[0060]收包模塊23,用于創(chuàng)建線程進(jìn)行收包,并編譯鏈接生成可執(zhí)行程序。具體來說,收包模塊23創(chuàng)建線程采用輪詢方式進(jìn)行收包,編譯鏈接生成可執(zhí)行程序。
[0061]內(nèi)存獲取單元3,連接到內(nèi)核態(tài)和用戶態(tài),用于從內(nèi)核態(tài)中獲取大塊連續(xù)內(nèi)存,并對(duì)所述大塊連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,使得用戶態(tài)具有訪問DMA內(nèi)存的權(quán)限。
[0062]其中,內(nèi)存獲取單元3的結(jié)構(gòu)如圖8所示,包括內(nèi)存申請(qǐng)模塊31、內(nèi)存地址獲取模塊32和內(nèi)存地址映射模塊33。
[0063]內(nèi)存申請(qǐng)模塊31,用于在在內(nèi)核態(tài)初始化時(shí),利用Bigphysarea申請(qǐng)大塊連續(xù)內(nèi)存,以備用戶態(tài)收發(fā)報(bào)文申請(qǐng)skb使用。具體地,在內(nèi)核態(tài)初始化時(shí),內(nèi)存申請(qǐng)模塊31利用Bigphysarea向內(nèi)核申請(qǐng)大塊連續(xù)內(nèi)存,以備用戶態(tài)收發(fā)報(bào)文申請(qǐng)skb使用,skb是標(biāo)識(shí)報(bào)文的一個(gè)數(shù)據(jù)結(jié)構(gòu),包括報(bào)文頭、數(shù)據(jù)段等,內(nèi)核的所有業(yè)務(wù)處理都基于skb數(shù)據(jù)結(jié)構(gòu)完成,其中Bigphysarea為大塊內(nèi)存申請(qǐng)的補(bǔ)丁,可以有效地解決操作系統(tǒng)無法申請(qǐng)大塊連續(xù)內(nèi)存的問題。優(yōu)選地,內(nèi)存申請(qǐng)模塊31向內(nèi)核申請(qǐng)大小為300M的連續(xù)內(nèi)存,當(dāng)然所要申請(qǐng)的連續(xù)內(nèi)存的大小可以根據(jù)操作系統(tǒng)總內(nèi)存的大小自行定義,如果總內(nèi)存越大,相應(yīng)地可以申請(qǐng)更大的連續(xù)內(nèi)存,反之要減小所要申請(qǐng)的連續(xù)內(nèi)存的大小。
[0064]內(nèi)存地址獲取模塊32,用于通過1ctI方式從內(nèi)核態(tài)獲取內(nèi)存申請(qǐng)模塊31所申請(qǐng)的所述大塊連續(xù)內(nèi)存的地址和大小。具體地,內(nèi)存地址獲取模塊32通過1ctl方式對(duì)申請(qǐng)的內(nèi)存進(jìn)行檢測,檢測出該內(nèi)存的地址和大小,如果檢測到地址和大小相符,則進(jìn)行獲取。
[0065]內(nèi)存地址映射模塊33,用于采用mmap函數(shù)將內(nèi)存地址獲取模塊32獲取的所述大塊連續(xù)內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址,使得收發(fā)報(bào)文使用的skb申請(qǐng)和釋放可以在映射后的這塊內(nèi)存中進(jìn)行。具體地,內(nèi)存地址映射模塊33將內(nèi)存申請(qǐng)模塊31所申請(qǐng)到的內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址,使得用戶態(tài)可以對(duì)這塊物理連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,以實(shí)現(xiàn)用戶態(tài)可以訪問到DMA的內(nèi)存。
[0066]硬件寄存器獲取單元4,用于通過用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小,使得用戶態(tài)具有讀寫ARM網(wǎng)口的硬件寄存器的權(quán)限。
[0067]其中,硬件寄存器獲取單元4的結(jié)構(gòu)如圖9所示,包括硬件寄存器地址獲取模塊41和硬件寄存器地址映射模塊42。
[0068]硬件寄存器地址獲取模塊41,用于通過用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小。
[0069]硬件寄存器地址映射模塊42,用于將硬件寄存器地址獲取模塊41所獲取的硬件寄存器的物理基地址及寄存器空間的大小定義為宏,通過mmap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址。
[0070]具體來說,在硬件寄存器地址獲取模塊41通過用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間的大小之后,硬件寄存器地址映射模塊42使用mmap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址,使得用戶態(tài)可以對(duì)ARM網(wǎng)口的硬件寄存器進(jìn)行管理,使得用戶態(tài)可以讀寫ARM網(wǎng)口的硬件控制寄存器。
[0071 ] 執(zhí)行單元5,用于執(zhí)行ARM網(wǎng)口的初始化函數(shù)進(jìn)行ARM網(wǎng)口驅(qū)動(dòng)加載,通過所述大塊連續(xù)內(nèi)存實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和釋放,收發(fā)報(bào)文。該執(zhí)行過程和內(nèi)核執(zhí)行過程相似,在所有與ARM網(wǎng)口驅(qū)動(dòng)及收發(fā)相關(guān)的操作中都需執(zhí)行。具體地,報(bào)文收發(fā)單元5在執(zhí)行ARM網(wǎng)口的初始化函數(shù)并加載驅(qū)動(dòng)后,分配收發(fā)資源,控制寄存器的配置、接口注冊(cè)及收發(fā)函數(shù)掛載,實(shí)現(xiàn)用戶態(tài)收發(fā)報(bào)文。其中分配收發(fā)的資源包括隊(duì)列、描述符、buffer緩存等。
[0072]如上所述,根據(jù)本發(fā)明的一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法和系統(tǒng),將ARM網(wǎng)口的驅(qū)動(dòng)加載以及網(wǎng)絡(luò)數(shù)據(jù)報(bào)文的處理均放在用戶態(tài),消除了內(nèi)核態(tài)驅(qū)動(dòng)帶來的系統(tǒng)調(diào)用及數(shù)據(jù)包拷貝的高額開銷,降低了 CPU性能的消耗;另外,用戶態(tài)驅(qū)動(dòng)具有強(qiáng)悍的調(diào)試能力,能將驅(qū)動(dòng)開發(fā)人員在操作系統(tǒng)繁瑣的調(diào)試作業(yè)中解放出來,進(jìn)一步提高了開發(fā)效率。
[0073]應(yīng)當(dāng)理解的是,本發(fā)明的上述【具體實(shí)施方式】僅僅用于示例性說明或解釋本發(fā)明的原理,而不構(gòu)成對(duì)本發(fā)明的限制。因此,在不偏離本發(fā)明的精神和范圍的情況下所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。此外,本發(fā)明所附權(quán)利要求旨在涵蓋落入所附權(quán)利要求范圍和邊界、或者這種范圍和邊界的等同形式內(nèi)的全部變化和修改例。
【權(quán)利要求】
1.一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植方法,其特征在于,所述方法包括以下步驟: 步驟SI,去除內(nèi)核態(tài)中ARM網(wǎng)口初始化函數(shù); 步驟S2,將去除的所述ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài); 步驟S3,用戶態(tài)從內(nèi)核態(tài)中獲取大塊連續(xù)內(nèi)存,并對(duì)所述大塊連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,使得用戶態(tài)具有訪問DMA內(nèi)存的權(quán)限; 步驟S4,用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小,使得用戶態(tài)具有讀寫ARM網(wǎng)口的硬件寄存器的權(quán)限; 步驟S5,用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)進(jìn)行ARM網(wǎng)口驅(qū)動(dòng)加載,通過所述大塊連續(xù)內(nèi)存實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和釋放,收發(fā)報(bào)文。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟S2進(jìn)一步包括: 步驟S21,將與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài); 步驟S22,對(duì)用戶態(tài)中植入的與ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)進(jìn)行整改,去掉用戶態(tài)不需要的操作; 步驟S23,創(chuàng)建線程進(jìn)行收包,將整改后的所述函數(shù)編譯鏈接生成可執(zhí)行程序。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟S3進(jìn)一步包括: 步驟S31,在內(nèi)核態(tài)初始化時(shí),利用大塊內(nèi)存申請(qǐng)補(bǔ)丁申請(qǐng)大塊連續(xù)內(nèi)存,以備用戶態(tài)收發(fā)報(bào)文申請(qǐng)數(shù)據(jù)結(jié)構(gòu)使用; 步驟S32,用戶態(tài)通過管理函數(shù)1ctl方式從內(nèi)核態(tài)獲取已申請(qǐng)的所述大塊連續(xù)內(nèi)存的地址和大??; 步驟S33,采用_ap函數(shù)將所述大塊連續(xù)內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟S4進(jìn)一步包括: 步驟S41,用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大??; 步驟S42,用戶態(tài)將獲取的所述硬件寄存器的物理基地址及寄存器空間的大小定義為宏,通過_ap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟S5進(jìn)一步包括: 用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)并加載驅(qū)動(dòng)后,分配收發(fā)資源,通過控制寄存器的配置、接口注冊(cè)及收發(fā)函數(shù)掛載,實(shí)現(xiàn)用戶態(tài)收發(fā)報(bào)文。
6.一種ARM網(wǎng)口驅(qū)動(dòng)的用戶態(tài)移植系統(tǒng),其特征在于,所述系統(tǒng)包括: 去除單元(I),用于去除內(nèi)核態(tài)中ARM網(wǎng)口初始化函數(shù); 移植單元(2),用于將所述去除單元(I)去除的ARM網(wǎng)口初始化函數(shù)中關(guān)于ARM網(wǎng)口驅(qū)動(dòng)初始化及收發(fā)報(bào)文相關(guān)的函數(shù)移植到用戶態(tài); 內(nèi)存獲取單元(3),用于從內(nèi)核態(tài)中獲取大塊連續(xù)內(nèi)存,并對(duì)所述大塊連續(xù)內(nèi)存進(jìn)行單獨(dú)管理,使得用戶態(tài)具有訪問DMA內(nèi)存權(quán)限; 硬件寄存器獲取單元(4),用于通過用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小,使得用戶態(tài)具有讀寫ARM網(wǎng)口的硬件寄存器的權(quán)限; 執(zhí)行單元(5),用于執(zhí)行ARM網(wǎng)口的初始化函數(shù)進(jìn)行ARM網(wǎng)口驅(qū)動(dòng)加載,通過所述大塊連續(xù)內(nèi)存實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和釋放,收發(fā)報(bào)文。
7.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述移植單元(2)包括移植模塊(21)、整改模塊(22)和收包模塊(23);其中, 所述移植模塊(21)用于將與ARM網(wǎng)口驅(qū)動(dòng)相關(guān)的函數(shù)移植到用戶態(tài); 所述整改模塊(22)用于對(duì)用戶態(tài)中植入的與ARM網(wǎng)口驅(qū)動(dòng)相關(guān)的函數(shù)進(jìn)行整改,去掉用戶態(tài)不需要的操作函數(shù); 所述收包模塊(23)用于創(chuàng)建線程進(jìn)行收包,并將整改后的所述函數(shù)編譯鏈接生成可執(zhí)行程序。
8.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述內(nèi)存獲取單元(3)包括內(nèi)存申請(qǐng)模塊(31)、內(nèi)存地址獲取模塊(32)和內(nèi)存地址映射模塊(33);其中, 所述內(nèi)存申請(qǐng)模塊(31)用于內(nèi)核態(tài)初始化時(shí),利用大塊內(nèi)存申請(qǐng)補(bǔ)丁申請(qǐng)大塊連續(xù)內(nèi)存,以備用戶態(tài)收發(fā)報(bào)文申請(qǐng)數(shù)據(jù)結(jié)構(gòu)使用; 所述內(nèi)存地址獲取模塊(32)用于通過管理函數(shù)1ctl方式從內(nèi)核態(tài)獲取已申請(qǐng)的所述大塊連續(xù)內(nèi)存的地址和大??; 所述內(nèi)存地址映射模塊(33)用于采用-ap函數(shù)將所述大塊連續(xù)內(nèi)存的地址映射為用戶態(tài)可操作的虛擬地址。
9.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述硬件寄存器獲取單元(4)包括硬件寄存器地址獲取模塊(41) 和硬件寄存器地址映射模塊(42);其中, 所述硬件寄存器地址獲取模塊(41)用于通過用戶態(tài)獲取ARM網(wǎng)口硬件寄存器的物理基地址及寄存器空間大小; 所述硬件寄存器地址映射模塊(42)用于將獲取的所述硬件寄存器的物理基地址及寄存器空間的大小定義為宏,通過_ap函數(shù)將硬件寄存器的物理基地址映射為用戶態(tài)虛擬地址。
10.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述執(zhí)行單元(5)進(jìn)一步用于在用戶態(tài)執(zhí)行ARM網(wǎng)口的初始化函數(shù)并加載驅(qū)動(dòng)后,分配收發(fā)資源,通過控制寄存器的配置、接口注冊(cè)及收發(fā)函數(shù)掛載,實(shí)現(xiàn)用戶態(tài)收發(fā)報(bào)文。
【文檔編號(hào)】G06F9/50GK104077190SQ201410251940
【公開日】2014年10月1日 申請(qǐng)日期:2014年6月9日 優(yōu)先權(quán)日:2014年6月9日
【發(fā)明者】高福亮 申請(qǐng)人:漢柏科技有限公司