高性能路由器硬件抽象層的關鍵技術(shù)研究

1 引 言

隨著Internet的飛速發(fā)展和寬帶技術(shù)的不斷出現(xiàn),骨干網(wǎng)絡核心路由器的體系結(jié)構(gòu)也發(fā)生了一些變化。近年來,高性能路由器體系結(jié)構(gòu)的研究和國內(nèi)外主流廠商生產(chǎn)的大部分商用高端路由器的實現(xiàn)方案中,普遍采用了集中式交換、分布式報文處理和轉(zhuǎn)發(fā)的體系結(jié)構(gòu)[1,2]。

提出了硬件抽象層(Hardware AbstractionLayer,HAL)的設計思想,成功地解決了分布式路由器面臨的通用性支撐軟件系統(tǒng)結(jié)構(gòu)設計問題,為構(gòu)建開放通用的路由器軟件基礎平臺提供了保證。硬件抽象層包括虛擬驅(qū)動、系統(tǒng)管理和內(nèi)部通信3大模塊,在整個路由器系統(tǒng)中的位置如圖1所示。

結(jié)合國家863重大課題“高性能IPv6路由器基礎平臺及實驗系統(tǒng)”,將文獻[3]中提出的硬件抽象層在嵌入式實時操作系統(tǒng)Hard HatLinux中進行了實現(xiàn)。本文針對高性能路由器體系結(jié)構(gòu)的特點,研究了硬件抽象層在實現(xiàn)過程中的關鍵技術(shù)。主要包括虛擬驅(qū)動的動態(tài)加載模式、基于分隔符的TCP實時傳輸方法、基于地址映射的內(nèi)核態(tài)與用戶態(tài)間的阻塞式數(shù)據(jù)交換機制幾個內(nèi)容。

2 支撐軟件在高性能IPv6路由器中實現(xiàn)的關鍵技術(shù)

2.1 虛擬驅(qū)動的動態(tài)加載模式

虛擬驅(qū)動模塊是模擬線路接口單元動作的重要部分,他的靈活性和可擴展性直接影響硬件抽象層的可用性。
  在Linux操作系統(tǒng)下,該模塊是作為一個內(nèi)核模塊來實現(xiàn)的。他可以實現(xiàn)實時動態(tài)加載,與靜態(tài)加載相比具有很大的靈活性。編譯時,內(nèi)核模塊可單獨進行模塊的編譯調(diào)試,縮短了調(diào)試時間;使用時,將該模塊鏈接到內(nèi)核,便可發(fā)揮模擬線路接口單元的作用;擴展或升級時,可以將其卸載后進行修改。除此之外,動態(tài)加載還可以縮減Linux內(nèi)核的大小,使編譯后的內(nèi)核小巧,占用內(nèi)存較少,提高了運轉(zhuǎn)速度。
  2.2 基于地址映射的內(nèi)核態(tài)與用戶態(tài)間的阻塞式數(shù)據(jù)交換機

Linux操作系統(tǒng)中的進程分為用戶態(tài)進程和內(nèi)核態(tài)進程2類,用戶態(tài)進程不能直接執(zhí)行運行在內(nèi)核態(tài)的內(nèi)核代碼或者存取操作系統(tǒng)內(nèi)核的數(shù)據(jù)結(jié)構(gòu)。在內(nèi)存管理方面,Linux系統(tǒng)采用虛擬內(nèi)存管理機制,設置了兩級頁表結(jié)構(gòu),通過頁面地址和在該頁中的偏移量就可以惟一確定虛擬地址所對應的物理地址。

在硬件抽象層的實現(xiàn)中,內(nèi)部通信處于用戶態(tài),虛擬驅(qū)動處于內(nèi)核態(tài)。而他們之間不可避免地需要進行一些數(shù)據(jù)的傳遞,即處于Linux不同空間的2個進程要進行通信。但是,這2個模塊分處于Linux系統(tǒng)的用戶空間和內(nèi)核空間,數(shù)據(jù)指針如何傳遞是一個問題,指針傳遞后如何映射又是一個問題。因此用戶態(tài)與內(nèi)核態(tài)之間內(nèi)存地址的傳遞和轉(zhuǎn)換成為了提高硬件抽象層工作效率的關鍵。

2.2.1 內(nèi)核態(tài)與用戶態(tài)的指針傳遞

先來解決內(nèi)存地址的傳遞問題,根據(jù)Linux驅(qū)動程序的特點,選擇ioctl()函數(shù)來傳遞指針。該函數(shù)屬于系統(tǒng)調(diào)用,調(diào)用后將一個類型為ifreq的結(jié)構(gòu)指針變量ral_ifr從用戶態(tài)傳入內(nèi)核態(tài),該結(jié)構(gòu)的定義在/include/linux/if.h中。
  
  使用了其中的ifrn_name和ifru_data兩個域,其中ifrn_name代表設備的名稱,即虛擬網(wǎng)絡接口設備名,ifru_data為所要傳遞的數(shù)據(jù)指針。使用系統(tǒng)調(diào)用ioctl()之后,用戶空間到內(nèi)核空間的指針傳遞就完成了。內(nèi)核空間到用戶空間的指針傳遞過程與其相反。因此,下一步要進行的是內(nèi)核空間與用戶空間數(shù)據(jù)指針的映射。
   
  2.2.2 內(nèi)核態(tài)與用戶態(tài)的內(nèi)存映射
  
  由2.2.1可知,用戶空間的指針通過ioctl傳入內(nèi)核空間后,他本身并沒有發(fā)生改變,需要進行虛擬地址到物理地址的映射才可以對其進行讀寫操作。

可以使用內(nèi)核kiobuf機制,他能提供從內(nèi)核空間對用戶內(nèi)存的直接訪問。內(nèi)核kiobuf機制的設計初衷就是為了便于將用戶空間的緩沖區(qū)映射到內(nèi)核。使用他能夠獲得數(shù)據(jù)的頁面起始位置、頁數(shù)和偏移量等具體參數(shù),因此可在內(nèi)核空間對用戶態(tài)申請的內(nèi)存進行操作。
  
  首先分配一個內(nèi)核I/O向量(kiovec)來產(chǎn)生kiobuf,使用函數(shù)如圖2所示。

然后再對其進行初始化,如圖3所示。

最后,將通過ioctl傳入的用戶空間指針ifru_data映射 到內(nèi)核態(tài),使用函數(shù)map_user_kiobuf,如圖4所示。

這樣就完成了將指針由用戶空間映射到內(nèi)核空間的過程,實現(xiàn)了從虛擬地址向物理地址的轉(zhuǎn)換。

至此,內(nèi)核空間與用戶空間的內(nèi)存映射問題得到了很好的解決。通過解決內(nèi)存地址映射的問題,內(nèi)部通信和虛擬驅(qū)動之間就可以只傳遞數(shù)據(jù)指針,大大提高了模塊的運行效率。

 

   來源:維庫開發(fā)網(wǎng)
微信掃描分享本文到朋友圈
掃碼關注5G通信官方公眾號,免費領取以下5G精品資料
  • 1、回復“YD5GAI”免費領取《中國移動:5G網(wǎng)絡AI應用典型場景技術(shù)解決方案白皮書
  • 2、回復“5G6G”免費領取《5G_6G毫米波測試技術(shù)白皮書-2022_03-21
  • 3、回復“YD6G”免費領取《中國移動:6G至簡無線接入網(wǎng)白皮書
  • 4、回復“LTBPS”免費領取《《中國聯(lián)通5G終端白皮書》
  • 5、回復“ZGDX”免費領取《中國電信5GNTN技術(shù)白皮書
  • 6、回復“TXSB”免費領取《通信設備安裝工程施工工藝圖解
  • 7、回復“YDSL”免費領取《中國移動算力并網(wǎng)白皮書
  • 8、回復“5GX3”免費領取《R1623501-g605G的系統(tǒng)架構(gòu)1
  • 本周熱點本月熱點

     

      最熱通信招聘

      最新招聘信息