專利名稱:一種基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)字家庭技術(shù)領(lǐng)域,具體涉及一種基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng)。
背景技術(shù):
隨著數(shù)字電視和Linux的不斷發(fā)展,數(shù)字電視機頂盒采用Linux內(nèi)核的產(chǎn)品越來越多。Linux內(nèi)核完全由C語言和匯編語言寫成,但是卻頻繁用到了面向?qū)ο蟮脑O(shè)計思想。 在設(shè)備驅(qū)動方面,往往為同類的設(shè)備設(shè)計了一個框架,而框架中的核心層則實現(xiàn)了該設(shè)備通用的一些功能??蚣茉跒殚_發(fā)工作帶來方便、健壯等優(yōu)越性的同時,也帶來了程序尺寸增大,運行速度降低等缺點,這不符合人們對驅(qū)動程序的要求。但隨著CPU速度和存儲器容量的快速發(fā)展,這樣的情況正在發(fā)生變化。最終用戶對驅(qū)動程序穩(wěn)定性和開發(fā)者對驅(qū)動程序研發(fā)速度和質(zhì)量的需求會成為選擇驅(qū)動開發(fā)工具的首要因素。目前數(shù)字電視機機頂盒Linux的設(shè)備驅(qū)動開發(fā)非常繁瑣,盡管幾乎所有的設(shè)備驅(qū)動程序在結(jié)構(gòu)上類似,但是要重用這些代碼卻并非易事。此外,現(xiàn)有的Linux設(shè)備驅(qū)動是基于過程設(shè)計的,容易出現(xiàn)控制流程過于復(fù)雜,模塊間耦合度高的問題。
發(fā)明內(nèi)容
為解決上述Linux驅(qū)動程序開發(fā)過程中的問題,本發(fā)明以C++為基礎(chǔ),設(shè)計了一個可重用的Linux設(shè)備驅(qū)動系統(tǒng),可大大提高代碼復(fù)用度,簡化開發(fā)過程,并從面向?qū)ο蟮慕嵌冉o出了一個設(shè)備驅(qū)動程序的構(gòu)造視圖。本發(fā)明提供一種基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng),所述系統(tǒng)包括Linux內(nèi)核單元,用于為驅(qū)動程序提供操作系統(tǒng)環(huán)境;Linux內(nèi)核面向?qū)ο笤O(shè)計單元,用于為Linux內(nèi)核提供面向?qū)ο笳Z言C++支持;驅(qū)動框架設(shè)計單元,用于為Linux內(nèi)核提供面向?qū)ο蟮尿?qū)動設(shè)計框架;驅(qū)動開發(fā)單元,用于為開發(fā)人員按照驅(qū)動框架進行填充,完成驅(qū)動開發(fā)。所述Linux內(nèi)核單元中的處理流程包括提供修改Linux內(nèi)核,使用面向?qū)ο笳Z言C++與Linux內(nèi)核兼容。使用Linux內(nèi)核函數(shù)重載C++中的new和delete方法,保持面向?qū)ο笳Z言在Linux 內(nèi)核的特性;驅(qū)動程序生命周期行為設(shè)計,實現(xiàn)驅(qū)動程序的裝載和卸載操作;驅(qū)動程序?qū)嶓w行為設(shè)計,在內(nèi)部封裝和系統(tǒng)交互的細(xì)節(jié)。所述系統(tǒng)使用extern C 關(guān)鍵字修飾 int init_module (void)和 void cleanup, module (void)裝載/隹P載函數(shù);對位于module, h中的kernel_version變量用violate關(guān)鍵字修飾,強制C++保有該變量;將Linux的內(nèi)核頭文件通過#include指令包裹在一個頭文件中,并在這個頭文件引用前利用#define指令轉(zhuǎn)義C++關(guān)鍵字,引用完畢后,再使用 #undef重置C++關(guān)鍵字。
所述系統(tǒng)重新定義KDriver抽象類,實現(xiàn)驅(qū)動程序裝載以及驅(qū)動程序卸載。
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其它的附圖。圖1是本發(fā)明實施例中的基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng)架構(gòu)圖;圖2是本發(fā)明實施例中的基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng)流程圖;圖3是本發(fā)明實施例中的面向?qū)ο笳Z言C++與Linux內(nèi)核兼容流程圖;圖4是本發(fā)明實施例中的面向?qū)ο笳Z言C++在Linux內(nèi)核中語言特性保持流程圖;圖5是本發(fā)明實施例中的驅(qū)動程序生命周期行為設(shè)計流程圖;圖6是本發(fā)明實施例中的驅(qū)動程序?qū)嶓w行為設(shè)計流程圖。
具體實施例方式下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述。本發(fā)明實施例提供一種基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng),能夠為Linux 驅(qū)動開發(fā)提供面向?qū)ο蟮目芍赜抿?qū)動設(shè)計方法,以下分別進行詳細(xì)說明。如圖1所示,本發(fā)明實施例中的驅(qū)動系統(tǒng)主要包括以下單元=Linux內(nèi)核單元、 Linux內(nèi)核面向?qū)ο笤O(shè)計單元、驅(qū)動框架設(shè)計單元、驅(qū)動開發(fā)單元。所述Linux內(nèi)核單元為驅(qū)動程序提供操作系統(tǒng)環(huán)境。所述Linux內(nèi)核面向?qū)ο笤O(shè)計單元為Linux內(nèi)核提供面向?qū)ο笳Z言C++支持。所述驅(qū)動框架設(shè)計單元為Linux內(nèi)核提供面向?qū)ο蟮尿?qū)動設(shè)計框架。所述驅(qū)動開發(fā)單元,開發(fā)人員按照驅(qū)動框架進行填充,完成驅(qū)動開發(fā)?;诒景l(fā)明實施例中的驅(qū)動系統(tǒng),這里的實現(xiàn)方案包括如下步驟1 修改Linux內(nèi)核,使用面向?qū)ο笳Z言C++與Linux內(nèi)核兼容。步驟2 使用Linux內(nèi)核函數(shù)重載C++中的new和delete方法,保持面向?qū)ο笳Z言在Linux內(nèi)核的特性。步驟3 驅(qū)動程序生命周期行為設(shè)計,利用圖3所示的驅(qū)動框架結(jié)構(gòu)實現(xiàn)驅(qū)動程序的裝載和卸載操作。步驟4 驅(qū)動程序?qū)嶓w行為設(shè)計,在內(nèi)部封裝和系統(tǒng)交互的細(xì)節(jié)。Kdriver, KDevice及其子類被定義為抽象類,類中除了聲明滿足Linux設(shè)備驅(qū)動規(guī)范的接口外,同時封裝了系統(tǒng)請求分發(fā)等規(guī)程。Etream代表了字符設(shè)備驅(qū)動,KBlock表示塊設(shè)備驅(qū)動。KDispatchObject及其子類封裝了系統(tǒng)內(nèi)核對象,如互斥同步、內(nèi)核定時器等。STL for kernel完成了 C++標(biāo)準(zhǔn)模板庫,在內(nèi)核中可以使用如set,vector等高級容器和相應(yīng)算法。此外還包括了部分IO接口標(biāo)準(zhǔn)??蚣苤?,IO接口、STL、內(nèi)核對象部分屬于簡單封裝,目的在于提供一個面向?qū)ο蟮耐庥^,可供開發(fā)人員直接使用。這部分的類不具備主動活動的能力,受KDriver及KDevice驅(qū)動進行工作。從開發(fā)者角度看,一個驅(qū)動程序由一個KDriver的子類和KDevice的子類構(gòu)成。開發(fā)者為完成驅(qū)動程序所需的工作就是在MyDevice類中將繼承自父類的虛函數(shù)重寫,增加和設(shè)備操作實際相關(guān)的代碼。圖3為面向?qū)ο笳Z言C++與Linux內(nèi)核兼容流程圖,Linux —直采用C作為內(nèi)核開發(fā)語言,為了保持和內(nèi)核的無縫結(jié)合,驅(qū)動程序也用C編碼,盡管C++可用于內(nèi)核編程,但由于驅(qū)動和普通應(yīng)用的差異,以及內(nèi)核缺乏對C++運行庫的支持使得并不能直接利用C++構(gòu)造驅(qū)動程序,故需要解決C++與Linux內(nèi)核的兼容性問題。步驟11 使用 extern C 關(guān)鍵字修飾 int init_module (void)和 void cleanup, module (void)裝載/卸載函數(shù)。步驟12 對位于module, h中的kernel_version變量用violate關(guān)鍵字修飾,強制C++保有該變量。步驟13 將Linux的內(nèi)核頭文件通過#include指令包裹在一個頭文件中,并在這個頭文件引用前利用#define指令轉(zhuǎn)義C++關(guān)鍵字,引用完畢后,再使用#undef重置C++
關(guān)鍵字。圖4為面向?qū)ο笳Z言C++在Linux內(nèi)核中語言特性保持流程圖由g++編譯器產(chǎn)生的C++對象的內(nèi)存布局在操作系統(tǒng)內(nèi)核和用戶態(tài)一致,基于此, C++語言的封裝性和繼承性在內(nèi)核模式下得以保存。但是,多態(tài)性必須依賴于C++對象動態(tài)創(chuàng)建和銷毀的能力,在內(nèi)核模式下,沒有用戶態(tài)程序的堆區(qū)域,沒有C++運行庫的支持,必須自己維護一個處于內(nèi)核模式下的“堆區(qū)域”和分配策略。解決這一問題的唯一途徑就是重載 operator new 及其 operator delete。步驟21 重載operator new。使用內(nèi)核函數(shù)kmalloc獲取存儲空間,此函數(shù)使用了內(nèi)核存儲分配器Slab的普通高速緩存。步驟22 在已獲得的內(nèi)存空間里進行對象的初始化工作。即調(diào)用對象的構(gòu)造函數(shù)。步驟23 重載operator delete。使用內(nèi)核函數(shù)kfree作為全局的銷毀符,釋放已用內(nèi)存空間。圖5為驅(qū)動程序生命周期行為設(shè)計流程圖,Linux設(shè)備驅(qū)動程序框架將系統(tǒng)繁瑣的細(xì)節(jié)向開發(fā)人員屏蔽,讓他們專注設(shè)備功能部分,如read,write等方法的實現(xiàn)??蚣芡ㄟ^對象間關(guān)系和某些巧妙設(shè)計的代碼完成這項屏蔽工作。使用傳統(tǒng)方法開發(fā)Linux設(shè)備驅(qū)動時,開發(fā)者總會定義好裝載/卸載函數(shù)后,然后在裝載函數(shù)中進行設(shè)備注冊,再開始初始化設(shè)備。這是個公式化的行為,框架應(yīng)該將這個操作序列封裝在自身內(nèi)部,然后通過一個定義良好的函數(shù)允許開發(fā)者進行一些自定義的初始化工作。對開發(fā)者而言,不再考慮裝載和設(shè)備注冊等過程,此函數(shù)成為驅(qū)動程序的生命起點。步驟31 定義KDriver抽象類,類中聲明滿足Linux設(shè)備驅(qū)動規(guī)范的接口并封裝了系統(tǒng)請求分發(fā)等規(guī)程,其中KDriver類包含Driver_Load驅(qū)動加載方法。步驟32 驅(qū)動程序裝載。需要框架正確產(chǎn)生一個對它而言類型未知的對象實例在裝載函數(shù)內(nèi),框架調(diào)用KDriver的靜態(tài)函數(shù)Driver_L0ad,由后者產(chǎn)生KDriver子類的實例, 再通過虛函數(shù)init進行子類的初始化。其中Driver_L0ad函數(shù)參考設(shè)計模式中的工廠模式,利用宏DECLARE_DRIVER(class)為一個特定的類指定創(chuàng)建工廠。驅(qū)動程序?qū)嶓w通過語句 DECLARE_DRIVER(MyDriver)的展開,生成函數(shù) create_Driver_instance (),該函數(shù)返回一個指向MyDriver實體的指針。步驟33 驅(qū)動程序卸載。卸載點函數(shù)被系統(tǒng)調(diào)用時,框架通過持有的MyDriver實體指針調(diào)用虛函數(shù)iminit進行清除工作。圖6為驅(qū)動程序?qū)嶓w行為設(shè)計流程圖,以傳統(tǒng)方式進行驅(qū)動程序開發(fā),必須對設(shè)備驅(qū)動的每個接口函數(shù)和系統(tǒng)交流的細(xì)節(jié)信息非常熟悉,例如在open接口中增加引用計數(shù),并且將驅(qū)動程序的狀態(tài)變量保存到接口要求的filp- > private_data??蚣軕?yīng)該在內(nèi)部封裝和系統(tǒng)交互的細(xì)節(jié),給出開發(fā)者友好的接口用于進行設(shè)備特定的處理。設(shè)備注冊時, Linux要求設(shè)備必須為系統(tǒng)提過的file_0perati0ns結(jié)構(gòu)綁定設(shè)備操作函數(shù)。框架將自身的靜態(tài)成員函數(shù)diSpatCh_XXX族填充該結(jié)構(gòu),成為系統(tǒng)調(diào)用的代理響應(yīng)函數(shù),下面以open 系統(tǒng)調(diào)用為例。步驟41 當(dāng)用戶通過系統(tǒng)調(diào)用open打開設(shè)備操作時,diSpatCh_0pen被首先調(diào)用, 該函數(shù)完成和系統(tǒng)內(nèi)核交互的必要工作。步驟42 調(diào)用設(shè)備實際的open方法,以一個簡單的接口面向開發(fā)者。步驟43 :diSpatCh_0pen通過內(nèi)部方法endopen將設(shè)備的open結(jié)果轉(zhuǎn)為系統(tǒng)內(nèi)核希望的方式返回給系統(tǒng)。需要說明的是,上述裝置和系統(tǒng)內(nèi)的各單元之間的信息交互、執(zhí)行過程等內(nèi)容,由于與本發(fā)明方法實施例基于同一構(gòu)思,具體內(nèi)容可參見本發(fā)明方法實施例中的敘述,此處不再贅述。本領(lǐng)域普通技術(shù)人員可以理解上述實施例的各種方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,該程序可以存儲于一計算機可讀存儲介質(zhì)中,存儲介質(zhì)可以包括只讀存儲器(ROM,Read Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、磁盤或光盤等。以上對本發(fā)明實施例所提供的一種嵌入式Linux網(wǎng)絡(luò)加速的方法,進行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。
權(quán)利要求
1.一種基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng),其特征在于,所述系統(tǒng)包括Linux內(nèi)核單元,用于為驅(qū)動程序提供操作系統(tǒng)環(huán)境;Linux內(nèi)核面向?qū)ο笤O(shè)計單元,用于為Linux內(nèi)核提供面向?qū)ο笳Z言C++支持;驅(qū)動框架設(shè)計單元,用于為Linux內(nèi)核提供面向?qū)ο蟮尿?qū)動設(shè)計框架;驅(qū)動開發(fā)單元,用于為開發(fā)人員按照驅(qū)動框架進行填充,完成驅(qū)動開發(fā)。
2.如權(quán)利要求1所述的基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng),其特征在于,所述 Linux內(nèi)核單元中的處理流程包括提供修改Linux內(nèi)核,使用面向?qū)ο笳Z言C++與Linux內(nèi)核兼容。使用Linux內(nèi)核函數(shù)重載C++中的new和delete方法,保持面向?qū)ο笳Z言在Linux內(nèi)核的特性;驅(qū)動程序生命周期行為設(shè)計,實現(xiàn)驅(qū)動程序的裝載和卸載操作;驅(qū)動程序?qū)嶓w行為設(shè)計,在內(nèi)部封裝和系統(tǒng)交互的細(xì)節(jié)。
3.如權(quán)利要求1所述的基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng),其特征在于,所述系統(tǒng)使用 extern C關(guān)鍵字修飾 int init_module (void)禾口 void cleanup_module (void)裝載 /卸載函數(shù);對位于module, h中的kernel_version變量用violate關(guān)鍵字修飾,強制C++ 保有該變量;將Linux的內(nèi)核頭文件通過iiinclude指令包裹在一個頭文件中,并在這個頭文件引用前利用#define指令轉(zhuǎn)義C++關(guān)鍵字,引用完畢后,再使用#undef重置C++關(guān)鍵字。
4.如權(quán)利要求1所述的基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng),其特征在于,所述系統(tǒng)重新定義KDriver抽象類,實現(xiàn)驅(qū)動程序裝載以及驅(qū)動程序卸載。
全文摘要
本發(fā)明公開了一種基于數(shù)字電視的Linux硬件設(shè)備驅(qū)動系統(tǒng),所述系統(tǒng)包括Linux內(nèi)核單元,用于為驅(qū)動程序提供操作系統(tǒng)環(huán)境;Linux內(nèi)核面向?qū)ο笤O(shè)計單元,用于為Linux內(nèi)核提供面向?qū)ο笳Z言C++支持;驅(qū)動框架設(shè)計單元,用于為Linux內(nèi)核提供面向?qū)ο蟮尿?qū)動設(shè)計框架;驅(qū)動開發(fā)單元,用于為開發(fā)人員按照驅(qū)動框架進行填充,完成驅(qū)動開發(fā)。本發(fā)明技術(shù)方案設(shè)計了一個可重用的Linux設(shè)備驅(qū)動系統(tǒng),可大大提高代碼復(fù)用度,簡化開發(fā)過程。
文檔編號G06F9/44GK102253834SQ20111018656
公開日2011年11月23日 申請日期2011年7月5日 優(yōu)先權(quán)日2011年7月5日
發(fā)明者孟思明, 張潔, 黃旭陽 申請人:中山大學(xué), 廣東星海數(shù)字家庭產(chǎn)業(yè)技術(shù)研究院有限公司