【文章內(nèi)容簡介】
與應(yīng)用程序之間的接口,設(shè)備驅(qū)動程序是操作系統(tǒng)內(nèi)核與機(jī)器硬件之間的接口 [10]。設(shè)備驅(qū)動程序是內(nèi)核的一部分,它完成以下功能:1. 對設(shè)備初始化和釋放2. 把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)3. 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請求的數(shù)據(jù)4. 檢測和處理設(shè)備出現(xiàn)的錯(cuò)誤圖 完整地表現(xiàn)了 Linux 驅(qū)動和系統(tǒng)之間的關(guān)系。應(yīng)用層系統(tǒng)調(diào)用接口虛擬文件系統(tǒng)設(shè)備接口緩存 網(wǎng)絡(luò)子層網(wǎng)絡(luò)設(shè)備驅(qū)動塊設(shè)備驅(qū)動字符設(shè)備驅(qū)動硬件圖 Linux 設(shè)備驅(qū)動模塊圖Linux 的設(shè)備驅(qū)動程序可以分為 3 個(gè)主要組成部分 [11]:1. 自動配置和初始化子程序,負(fù)責(zé)監(jiān)測所有驅(qū)動的硬件設(shè)備是否存在和能否正常工作。如果該設(shè)備正常,則對這個(gè)設(shè)備及其相關(guān)的設(shè)備驅(qū)動程序需要的軟件狀態(tài)進(jìn)行初始化。這部分驅(qū)動程序僅在初始化時(shí)被調(diào)用一次。2. 服務(wù)于 I/O 請求的子程序,又稱為驅(qū)動程序的上半部分。調(diào)用這部分程序是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行時(shí),系統(tǒng)仍認(rèn)為是與進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因而可以在其中調(diào)用 sleep()等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。3. 中斷服務(wù)子程序,又稱為驅(qū)動程序的下半部分。在 Linux 系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動程序的中斷服務(wù)子程序,而是由 Linux 系統(tǒng)來接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以在任何一個(gè)進(jìn)程運(yùn)行時(shí)產(chǎn)生,因而在中斷服務(wù)程序被調(diào)用時(shí),不能依賴于任何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序時(shí),都帶有一個(gè)或多個(gè)參數(shù),以唯一第二章 相關(guān)技術(shù)背景 11標(biāo)識請求服務(wù)的設(shè)備。在 Linux 中,幾乎所有的內(nèi)容都是文件,對設(shè)備驅(qū)動的訪問也是以文件操作的方式實(shí)現(xiàn) [12]。無論是字符設(shè)備還是塊設(shè)備,用戶對設(shè)備的操作都是通過虛擬文件系統(tǒng)(VFS) 轉(zhuǎn)化為設(shè)備驅(qū)動與硬件操作程序的交互。即使是訪問網(wǎng)絡(luò)設(shè)備的socket 接口,也是通過 VFS 實(shí)現(xiàn)的。Linux 通過 VFS 為用戶提供了一個(gè)統(tǒng)一的設(shè)備訪問接口,使用戶能夠透明地訪問設(shè)備驅(qū)動程序。所有的硬件設(shè)備都可以使用和操作系統(tǒng)調(diào)用接口來打開、關(guān)閉、讀寫和 I/O 控制,而驅(qū)動程序的主要任務(wù)就是實(shí)現(xiàn)這些系統(tǒng)調(diào)用函數(shù)。Linux 系統(tǒng)中的所有硬件設(shè)備都使用一種特殊的設(shè)備文件來表示。每個(gè)設(shè)備文件都有兩個(gè)設(shè)備號:一個(gè)是主設(shè)備號,它用來標(biāo)識該設(shè)備的種類,也標(biāo)識該設(shè)備使用的驅(qū)動程序;另一個(gè)是次設(shè)備號,用來標(biāo)識使用同一設(shè)備驅(qū)動程序的不同硬件設(shè)備。實(shí)現(xiàn)一個(gè)嵌入式 Linux 設(shè)備驅(qū)動的大致流程如下: 1. 定義主、次設(shè)備號,也可以動態(tài)獲取。2. 實(shí)現(xiàn)驅(qū)動初始化和清除函數(shù),如果驅(qū)動程序采用模塊方式,則要實(shí)現(xiàn)模塊初始化和清除函數(shù)。3. 設(shè)計(jì)所要實(shí)現(xiàn)的文件操作,定義 file_operations 結(jié)構(gòu)。4. 實(shí)現(xiàn)所需的文件操作調(diào)用,如 read、write 等。5. 實(shí)現(xiàn)中斷服務(wù)函數(shù),并用 request_irq 向內(nèi)核注冊。中斷并不是每個(gè)設(shè)備驅(qū)動所需要。6. 將驅(qū)動編譯到內(nèi)核或編譯成模塊,用 insmod 命令加載。 7. 生成設(shè)備節(jié)點(diǎn)文件。file_operation 結(jié)構(gòu)中的成員幾乎全部是函數(shù)指針,它們是系統(tǒng)調(diào)用函數(shù)的真正處理函數(shù),所以實(shí)質(zhì)上就是函數(shù)跳轉(zhuǎn)表。每個(gè)進(jìn)程對設(shè)備的操作都會根據(jù)major、 minor 設(shè)備號,轉(zhuǎn)換成對 file_operation 結(jié)構(gòu)的訪問。常用的操作包括以下幾種:1. lseek,移動文件指針的位置,只能用于可以隨機(jī)存取的設(shè)備。2. read,進(jìn)行讀操作,參數(shù) buf 為存放讀取結(jié)果的緩沖區(qū), count 為所要讀取的數(shù)據(jù)長度。返回值為負(fù)表示讀取操作發(fā)生錯(cuò)誤;否則,返回實(shí)際讀取的字節(jié)數(shù)。對于字符型,要求讀取的字節(jié)數(shù)和返回的實(shí)際讀取字節(jié)數(shù)都必須是inodei_blksize 的倍數(shù)。3. write,進(jìn)行寫操作,與 read 類似。4. readdir,取得下一個(gè)目錄入口點(diǎn),只有與文件系統(tǒng)相關(guān)的設(shè)備程序才使用。5. select,進(jìn)行選擇操作。如果驅(qū)動程序沒有提供 select 入口,select 操作會認(rèn)為設(shè)備已經(jīng)準(zhǔn)備好進(jìn)行任何 I/O 操作?;跓o線控制器的接口管理126. ioctl,進(jìn)行讀、寫以外的其他操作,參數(shù) cmd 為自定義的命令。7. mmap,用于把設(shè)備的內(nèi)容映射到地址空間,一般只有塊設(shè)備驅(qū)動程序使用。8. open,打開設(shè)備準(zhǔn)備進(jìn)行 I/O 操作。返回 0 表示打開成功,返回負(fù)數(shù)表示失敗。如果驅(qū)動程序沒有提供 open 入口,則只要 /dev/driver 文件存在就認(rèn)為打開成功。9. release,即 close 操作。在用戶自己的驅(qū)動程序中,首先要根據(jù)驅(qū)動程序的功能,完成 file_operation結(jié)構(gòu)中函數(shù)實(shí)現(xiàn)。不需要的函數(shù)接口可以直接在 file_operation 結(jié)構(gòu)中初始化為NULL。file_operation 變量會在驅(qū)動程序初始化時(shí)注冊到系統(tǒng)內(nèi)部。當(dāng)操作系統(tǒng)對設(shè)備操作時(shí),會調(diào)用驅(qū)動程序注冊的 file_operation 結(jié)構(gòu)中的函數(shù)指針。對于網(wǎng)絡(luò)設(shè)備來說在 Linux 里有專門的處理。Linux 的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD unix 的 socket 機(jī)制。在系統(tǒng)和驅(qū)動程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對多協(xié)議的支持。所有的 Linux 網(wǎng)絡(luò)驅(qū)動程序都遵循通用的接口。設(shè)計(jì)時(shí)采用的是面向?qū)ο蟮姆椒?。一個(gè)設(shè)備就是一個(gè)對象(device 結(jié)構(gòu)) ,它內(nèi)部有自己的數(shù)據(jù)和方法。每一個(gè)設(shè)備的方法被調(diào)用時(shí)的第一個(gè)參數(shù)都是這個(gè)設(shè)備對象本身。這樣這個(gè)方法就可以存取自身的數(shù)據(jù)(類似面向?qū)ο蟪绦蛟O(shè)計(jì)時(shí)的 this 引用) 。 一個(gè)網(wǎng)絡(luò)設(shè)備最基本的方法有初始化、發(fā)送和接收。網(wǎng)絡(luò)驅(qū)動的收發(fā)報(bào)文流程圖如圖 。 D e l i v e r p a c k e t sd e v _ q u e u e _ x m i t ( )R e c e i v e p a c k e t s n e t i f _ r x ( )M e t h o d s a n d v a r i a b l e s ( i n i t i a l i z e , o p e n , c l o s e , h a r d _ x m i t , i n t e r r u p t , h a n d l e r , c o n f i g , r e s o u r c e s , s t a t u s . . . )S e n d t o h a r d w a r eR e c e i v c e f r o m h a r d w a r eH a r d w a r e m e d i a圖 網(wǎng)絡(luò)驅(qū)動收發(fā)報(bào)文流程圖初始化程序完成硬件的初始化,完成 device 中變量的初始化和系統(tǒng)資源的申請。發(fā)送程序是在驅(qū)動程序的上層協(xié)議層有數(shù)據(jù)要發(fā)送時(shí)自動調(diào)用的。一般驅(qū)動程序中不對發(fā)送數(shù)據(jù)進(jìn)行緩存,而是直接使用硬件的發(fā)送功能把數(shù)據(jù)發(fā)送出去。接收數(shù)據(jù)一般是通過硬件中斷來通知的。在中斷處理程序里,把硬件幀信息填入第二章 相關(guān)技術(shù)背景 13一個(gè) skbuff 結(jié)構(gòu)中,然后調(diào)用 if_rx()傳遞給上層處理。 Linux開源項(xiàng)目1998 年 4 月 7 日,由 Tim O`Reilly 出面,組織并主持了一次“自由軟件峰會”,討論“自由軟件”的稱謂問題。最終使用“Open Source”(“開源” )這個(gè)詞。2022 年 Gartner 發(fā)表一份研究報(bào)告,認(rèn)為在未來幾年,幾乎所有企業(yè)都將使用開源軟件。 Gartner 集團(tuán)在一份名為“The State of Open Source 2022”的研究報(bào)告中預(yù)測:到 2022 年, (全球)90%以上的企業(yè)都將使用開源軟件 [13]。 路由管理之 QuaggaQuagga[14]是開源的路由軟件,為 Linux 平臺上實(shí)現(xiàn)了 OSPF 版本 2,OSPF 本版 3,RIP 版本 1 和版本 2,RIPng 以及 BGP4 等路由協(xié)議。Quagga 是由Kunihiro Ishiguro 開發(fā)的 GNU Zebra 的衍生而來。 Quagga 樹的目標(biāo)是建立很多緊密聯(lián)系在 Quagga 周圍的組織,而不是像 GNU Zebra 現(xiàn)在的集中控制處理一樣。Quagga 體系結(jié)構(gòu)包括兩個(gè)功能模塊,一個(gè)是 Vtysh,一個(gè)是 Zebra。Zebra[15]。Zebra 是一種 TCP/IP 路由軟件,它支持 BGPBGP4+、OSPFvOSPFvRIPvRIPv2 和 RIPng。它符合 GNU 的 GPL 標(biāo)準(zhǔn),可以運(yùn)行在 Linux 和其它 Unix 變體系統(tǒng)上。Zebra 是最先進(jìn)的路由軟件之一,最新版本可以從 GUN Zebra Web 站點(diǎn)上下載。Zebra 可以利用模塊法對各種協(xié)議進(jìn)行管理,這種設(shè)計(jì)是獨(dú)一無二的。它可以根據(jù)用戶的需要激活或者停止協(xié)議。除此以外,Quagga 體系結(jié)構(gòu)擁有豐富的庫文件來支持協(xié)議的實(shí)現(xiàn)和客戶端守護(hù)進(jìn)程的開發(fā),明確的配置和管理。Quaaga 的守護(hù)進(jìn)程都是可配置的,可利用Vtysh——Quagga 的 CLI。 Vtysh 作為所有守護(hù)進(jìn)程的終端,組織對 Quagga 所有的命令節(jié)點(diǎn)。Quagga 體系結(jié)構(gòu)如下圖所示 [16]:基于無線控制器的接口管理14V t y s h R I P d / n g R I P d / n g R I P d / n gZ e b r aQ u a g g a l i b r a r yI P / R o u t i n g T a b l eL n i u x K e r n e lU S E RK E R N E LV t y s hZ e b r a c o n n e c t圖 Quagga 結(jié)構(gòu)圖 Linux邏輯總線之 DBusDBus[17](其中 D 原先是代表桌面 “Desktop”的意思 )是一個(gè)提供簡單的應(yīng)用程序互通訊的自由軟件,它是作為 項(xiàng)目的一部分開發(fā)的。DBus深深地受到了 DCOP 系統(tǒng)的影響而且將在 KDE 4 版本的 release 中取代 DCOP。它已經(jīng)被應(yīng)用在 Qt4,GNOME,WINDOWS 以及 Maemo 等系統(tǒng)中。GNOME 也逐漸用它來取代了大部分早期的 Bonobo 機(jī)制。DBus 是相對來講比較新的進(jìn)程間通信(IPC)機(jī)制。在桌面操作系統(tǒng)中,扮演著一個(gè)統(tǒng)一中間層的一個(gè)角色。有很多的項(xiàng)目都用了 DBus,比如:GNOME、Hildon 等。 相對于其它的 IPC,DBus 丟掉了一些不必要的、復(fù)雜的東西,也正是因?yàn)檫@個(gè)原因,DBus 比較快、簡單。DBus 不和低層的 IPC 直接競爭,比如 sockets, shared memory or message queues。DBus 的主要目的是提供如下的一些更高層的功能:1. 結(jié)構(gòu)化的名字空間2. 獨(dú)立于架構(gòu)的數(shù)據(jù)格式3. 支持消息中的大部分通用數(shù)據(jù)元素4. 帶有異常處理的通用遠(yuǎn)程調(diào)用接口5. 支持廣播類型的通信在系統(tǒng)和用戶之間有明確的區(qū)分,這對于處理多用戶系統(tǒng)非常重要不局限于任何特定的編程語言,同時(shí)提供了語言綁定方法,來和一些通用的高級語言綁定,比如 C, C++, Python 等。 DBus 的設(shè)計(jì)得益于在桌面系統(tǒng)中其它 IPC 的長期經(jīng)驗(yàn)總結(jié),正是有了這些豐富的經(jīng)驗(yàn),才使得 DBus 的設(shè)計(jì)得以優(yōu)化。同時(shí) DBus 也不會受累于緩慢的功能改進(jìn)(creeping featurism) 。DBus 的架構(gòu)以及一些術(shù)語 [18]:在 DBus 中, “bus”是核心的概念,它是一第二章 相關(guān)技術(shù)背景 15個(gè)通道,不同的程序可以通過這個(gè)通道做些操作,比如方法調(diào)用、發(fā)送信號和監(jiān)聽特定的信號。通常情況下,只會存在一個(gè)系統(tǒng)通道,但是可以有不同的會話通道(每人一個(gè)桌面會話) 。通過 DBus 發(fā)送消息通常包含如下步驟:創(chuàng)建和發(fā)送消息給后臺 bus daemon進(jìn)程,這個(gè)過程中會有兩個(gè)上下文的切換,后臺 bus daemon 進(jìn)程會處理該消息,并轉(zhuǎn)發(fā)給目標(biāo)進(jìn)程。這也會引起上下文的切換目標(biāo)程序接收到消息,然后根據(jù)消息的種類做不同的響應(yīng),要么給個(gè)確認(rèn)、要么應(yīng)答、還有就是忽略它。最后一種情況對于“通知”類型的消息而言,前兩種都會引起進(jìn)一步的上下文切換。如果準(zhǔn)備使用 DBus 在不同的進(jìn)程之間傳遞大量的數(shù)據(jù),DBus 可能不是最有效的方法,最有效的方法是使用共享內(nèi)存,但是對共享內(nèi)存的管理也是相當(dāng)復(fù)雜的。DBus 的地址和名字是為了把消息正確的送給接收者 [19],IPC 機(jī)制需要具有某種或某些尋址能力。DBus 所設(shè)計(jì)的尋址方案是非常靈活和高效的。每個(gè)通道(bus) 都有它私人的名字空間,和別的通道區(qū)分開來?;跓o線控制器的接口管理16第三章 無線控制器體系結(jié)構(gòu) 17第三章 無線控制器體系結(jié)構(gòu) 無線控制器的功能無線控制器從根本上說是一種企業(yè)級交換機(jī)。企業(yè)級交換機(jī)屬于高端交換機(jī),一般采用模塊化的結(jié)構(gòu),可作為企業(yè)網(wǎng)絡(luò)骨干構(gòu)建高速局域網(wǎng),所以它通常用于企業(yè)網(wǎng)絡(luò)的最頂層。企業(yè)級交換機(jī)可以提供用戶化定制、優(yōu)先級隊(duì)列服務(wù)和網(wǎng)絡(luò)安全控制,并能很快適應(yīng)數(shù)據(jù)增長和改變的需要,從而滿足用戶的需求。對于有更高需求的網(wǎng)絡(luò),企業(yè)級交換機(jī)不僅能傳