王雪文,劉 杰,蘭雨晴
1(首都師范大學 信息工程學院,北京 100048)
2(北京航空航天大學 計算機學院,北京 100191)
3(麒麟軟件有限公司,北京 100190)
2018年10月,倪光南院士在首屆新智慧城市建設峰會上,再次提到發(fā)展國產操作系統(tǒng)的重要性.他提到,“網絡信息與網絡安全越來越具備時代特征,自主可控替代變得尤為重要”.2020年3月20 號,在麒麟軟件“遨天”計劃發(fā)布會上,倪光南強調,在構建安全可控的國產信息技術體系過程中,操作系統(tǒng)是軟件之魂,大國重器.麒麟OS是基于Linux的二次開發(fā),Linux kernel是整個操作系統(tǒng)的最底層,也是操作系統(tǒng)最基礎的部分,OS是不能夠直接控制硬件的,設備驅動是操作系統(tǒng)和硬件設備間的粘合劑,沒有驅動程序大多硬件設備無法工作,驅動程序在內核中占據(jù)約50%的代碼,起著至關重要的作用.眾所周知,驅動程序很難開發(fā)和調試.這對硬件產品的發(fā)布具有負面影響,因為上市時間通常由驅動程序開發(fā)和驗證計劃控制[1].在這樣的形勢下麒麟操作系統(tǒng)需要大量的新進內核驅動程序維護和開發(fā)人員,但麒麟OS 下還沒有供研發(fā)人員和用戶使用的驅動程序學習軟件.本文旨在研究、設計和開發(fā)麒麟OS 環(huán)境下基于Qt的內核驅動程序學習系統(tǒng).此系統(tǒng)采用SQLite 數(shù)據(jù)庫、FTP 服務器、HTTP和TCP協(xié)議、Qmedia 視頻框架、SQLTableModel 表格模型、交叉編譯等,在驅動程序信息提取部分,借助多模式串匹配AC 算法,為使算法的執(zhí)行時間減少,提出了一種改進的AC 算法簡稱為S_AC.此系統(tǒng)有效彌補了驅動程序學習部分的短缺,經驗證系統(tǒng)能穩(wěn)定運行.麒麟OS 環(huán)境下基于Qt的內核驅動程序學習系統(tǒng),能體現(xiàn)出其巨大的價值,降低企業(yè)新人的學習周期,能夠節(jié)省工程師對內核驅動程序的維護時間,降低企業(yè)運營成本.更深一層次講,有助于推進國產操作系統(tǒng)版本的發(fā)布和維護,從而有利于國產操作系統(tǒng)的推廣和普及,更好的保障國家信息、金融、國防等行業(yè)的安全,使網絡信息與網絡安全越來越具備時代特征,實現(xiàn)真正的自主可控、安全可靠.
為保證國家信息安全,必須大力發(fā)展自主可控技術,即信息系統(tǒng)從硬件到軟件都是自主研究、創(chuàng)造、開發(fā)、維護,從而實現(xiàn)真正的信息安全可控.發(fā)展國產操作系統(tǒng)是勢在必行,很有前景的工作,發(fā)展國產操作系統(tǒng)是一件利國利民、大有裨益的事業(yè).現(xiàn)在中美貿易摩擦局勢緊張,眾所周知從2018年到現(xiàn)在中美一直打貿易戰(zhàn),美國針對中國的一些制造業(yè)以及高科技產業(yè)加收高額關稅,對中國的一些企業(yè)影響較大,比如華為,阿里巴巴等大公司,特朗普曾說,美國最不能接受的事情是在高科技產業(yè)上被中國取代或反超.有了真正屬于自己的操作系統(tǒng),我們在很多方面就可以不用受制于人,可以保證我們的金融、國防、信息等行業(yè)的安全.20世紀90年代初,國家有關部門就開始倡導發(fā)展自主操作系統(tǒng),國產操作系統(tǒng)企業(yè)努力了多年,目前在產業(yè)規(guī)模、支撐應用能力等多個方面有了很大的提高[2].
麒麟OS是名氣較大和使用人數(shù)最多的國產操作系統(tǒng).據(jù)統(tǒng)計麒麟OS 已經連續(xù)八年國內Linux 市場占有率第一.麒麟操作系統(tǒng)系列產品主要以操作系統(tǒng)技術為核心,安全可信為特色,其產品已經在政府、國防、金融、教育、財稅、公安、審計、交通、醫(yī)療、制造等行業(yè)得到深入應用,應用領域涉及我國信息化和民生各個方面,多個領域已經進入核心應用部分.
麒麟操作系統(tǒng)具有高安全、高可靠、高可用、跨平臺以及強大的中文處理能力等優(yōu)點,被越來越多的用戶所接受.2020年3月麒麟軟件發(fā)布了“5年‘遨天’行動計劃”,旨在打造國家操作系統(tǒng)的最強力量,持續(xù)為用戶提供高質量服務,讓操作系統(tǒng)帶動我國信息產業(yè)市場規(guī)模和技術創(chuàng)新的發(fā)展.麒麟“遨天”行動將帶動萬億產業(yè)規(guī)模,服務國家關鍵基礎設施建設,推動網安產業(yè)變革進步,用五年時間,培育一支規(guī)模逾萬人的自主操作系統(tǒng)精英團隊,積極推動聯(lián)合創(chuàng)新和開放發(fā)展,走一條內生安全、融入移動、注重體驗、支撐體系的特色發(fā)展道路.麒麟OS 作為國內領先國產操作系統(tǒng),在促進基礎軟件國產化以及信息技術自主可控方面義不容辭.
在操作系統(tǒng)方面,暫時還做不到完全自主開發(fā),也沒有這個必要,開源Linux 內核功能完善,安全性更強[3],多用戶多任務獨立運行,具有良好的用戶界面,設備獨立性強,同時具有良好的可移植性.開源Linux是一個很好的基礎,針對它進行二次開發(fā),可以給我們節(jié)省不少人力和財力.中國工程院院士倪光南曾表示,國產操作系統(tǒng)的競爭力很大程度上取決于其生態(tài)系統(tǒng)的建設.其實和國產芯片一樣,包括麒麟OS 在內的國產操作系統(tǒng)面臨的不僅是技術問題,更重要的是生態(tài).如果生產出的OS 沒有生態(tài)支持,就很難推廣.所以接下來需要大力發(fā)展態(tài),適配更多的軟硬件,并加大自主創(chuàng)新,為開源社區(qū)貢獻更大的力量,同時增加我們在開源基金會、開源社區(qū)的話語權.
內核,是一個操作系統(tǒng)的核心,是操作系統(tǒng)的基礎,它負責整個硬件的驅動,以及提供各種系統(tǒng)所需的核心功能.計算機真正工作的東西其實是硬件,如果內核不認識某個最新的硬件,那么硬件也就無法被驅動,計算機也就無法使用該硬件[4].
設備驅動程序(device driver),是一種可以使計算機和設備進行相互通信的特殊程序.一般而言,驅動程序負責以下3 個任務:(1)配置和管理一個或多個設備;(2)將來自內核的請求轉換為對硬件的請求;(3)將結果從硬件傳遞到內核.
內核代碼3000 多萬行,其中驅動程序占了大約50%的代碼.正是因為驅動程序的重要性以及其相對較難開發(fā)的特點,國內外越來越多專家、學者對Linux內核及設備驅動投入大量精力研究.清華大學信息科學與技術國家實驗室的Bai 等[5]提出了從原始被動驅動程序代碼到自動生成高效的主動驅動程序的方法AutoPA,AutoPA 使用源代碼系統(tǒng)來實現(xiàn)驅動程序轉換,還使用改進的主動驅動程序體系結構來減少性能下降.驅動程序對于操作系統(tǒng)來說至關重要.
系統(tǒng)總體結構如圖1所示,系統(tǒng)分為展示層、功能層、數(shù)據(jù)層.其中,展示層即Qt 界面層,多個UI 用來展示界面信息;功能層主要是8 大功能模塊:網絡請求、遠程文件下載與上傳、內核驅動一般架構、驅動詳細分類、驅動學習機理、視頻學習、具體驅動、設置(計算機信息和系統(tǒng)升級檢測).數(shù)據(jù)層主要用于服務器學習文件和視頻文件的存儲,以及SQLite、MySQL數(shù)據(jù)庫中內核驅動程序信息、驅動程序詳細分類的存儲.在展示層通過點擊功能按鈕,觸發(fā)Qt的信號和槽機制,點擊按鈕時會發(fā)出一個或多個信號,當信號發(fā)出時,與之相連的槽函數(shù)會自動回調,從而完成展示層與功能層的連接,將每個點擊事件、滾動事件等與各個功能模塊貫通.數(shù)據(jù)層與各功能模塊密不可分,用來存儲各個功能模塊的數(shù)據(jù)信息,比如具體驅動模塊的幾百條驅動信息存儲在SQLite 數(shù)據(jù)庫,共享的驅動程序學習文件以及較大的視頻學習文件存儲在遠程FTP 服務器上,當用戶需要時則可進入對應功能模塊進行下載查看.數(shù)據(jù)層的數(shù)據(jù)信息通過各功能模塊加工、改造間接展現(xiàn)在展示層的UI 界面上,以便用戶查看.
圖1 系統(tǒng)總體結構圖
開發(fā)流程圖如圖2所示,需求分析是軟件計劃階段的重要活動,也是軟件生存周期中的一個重要環(huán)節(jié),在設計驅動程序學習系統(tǒng)之前,首先要做的就是需求分析,確定系統(tǒng)實現(xiàn)的功能,完成的工作.系統(tǒng)設計包括架構設計、功能設計、應用程序接口設計等,在系統(tǒng)設計過程中首先確定本發(fā)明的架構,架構圖是頂層設計,如果沒有頂層設計,統(tǒng)一合理地把軟件的功能需求和非功能需求分配到軟件部件當中,那么最后將不是一個好的軟件.其次是功能設計,功能設計根據(jù)系統(tǒng)的需求將功能落地,再次是應用程序接口設計.再就是編碼設計,即編程實現(xiàn),為了適應X86、ARM、MIPS三種架構平臺,需要交叉編譯腳本,進行交叉編譯.最后是應用部署,包括部署、測試和優(yōu)化設計,在本地機器上安裝,進行測試,根據(jù)實際問題反饋,然后優(yōu)化設計,再進行安裝測試,直到最優(yōu).
圖2 系統(tǒng)開發(fā)流程圖
系統(tǒng)的功能圖如圖3所示,該驅動程序學習系統(tǒng)的軟件部分包含網絡請求、遠程文件下載與上傳、內核驅動一般架構、驅動詳細分類、驅動學習機理、視頻學習、具體驅動、設置(計算機信息和系統(tǒng)升級檢測)8 大功能模塊,以下具體介紹各個模塊的作用以及實施機制.
圖3 系統(tǒng)功能模塊
3.2.1 遠程文件上傳與下載模塊主要功能及實現(xiàn)機制
遠程文件的上傳與下載模塊有兩個子功能模塊,分別是學習資料的下載和學習筆記的上傳,具體實施是創(chuàng)建FTP 服務器賬號和密碼,在服務器上創(chuàng)建學習資料庫用于用戶選擇下載所需的驅動學習資料,創(chuàng)建用戶個人庫,用于用戶學習筆記等文件的存儲.遠程文件的上傳與下載模塊的Qt 界面設計如圖4所示.用戶通過服務器地址、用戶名和密碼登錄FTP服務器,建立FTP的連接,在Qt 界面的Tree Widget控件中顯示FTP 服務器上可以公用下載的資源,同時可以顯示資源文件名稱、大小、擁有者、所屬組以及修改日期等.用戶選好資料點擊下載按鈕,下載到本地計算機,通過Progress Bar 控件可以顯示下載進度,選擇本地的學習筆記,通過點擊上傳按鈕,上傳至服務器的用戶個人空間,同時Progress Bar 控件顯示上傳進度.
圖4 遠程文件的上傳與下載模塊的Qt 界面
下面是連接FTP 服務器的代碼,先通過服務器地址和端口號建立連接,再通過用戶名和密碼進行登錄.
下面代碼是下載按鈕的槽函數(shù),下載前先進行編碼轉換,因為文件名可能是中文,然后通過文件名進行下載.
3.2.2 驅動學習模塊主要功能及實施機制
驅動學習機理模塊包含驅動程序調試技術、內核配置及對應的功能、驅動程序編寫相關知識3 個子模塊,各子模塊的內容通過Text Browser 控件顯示,方便用戶瀏覽.其中驅動程序調試技術包括內核追蹤kgdb、打印調試printk、調試工具strace 等,kgdb、printk、strace 等都是常用的內核開發(fā)及維護的調試技術,但對于新進開發(fā)人員來說并不那么容易掌握,網上資源零亂且有限,該模塊對各個調試技術有具體介紹和應用舉例,以便用戶學習.
內核配置及對應功能子模塊包括內核常用配置及相應注解,以及每項配置的作用,用戶通過此功能模塊可以了解并掌握常用內核配置,以便在實際操作中運用.
驅動編寫子模塊包括驅動程序的初始化、驅動程序的注冊、探測函數(shù)、驅動程序的加載和卸載,同時還有關于MakeFile 文件編寫的介紹.
3.2.3 內核驅動一般架構模塊主要功能及實施機制
內核驅動一般架構模塊功能設計如圖5所示,在此功能模塊中繪制內核的一般架構圖,包含用戶空間、內核空間、硬件部分,點擊詳細介紹按鈕,觸發(fā)點擊事件,進入點擊事件槽函數(shù),用戶可以看到架構圖中系統(tǒng)調用接口、進程管理、內存管理、虛擬文件系統(tǒng)、網絡接口、進程間通信、塊設備、字符設備、網絡設備以及設備驅動程序等的詳細介紹,有助于用戶深入理解內核驅動一般架構圖.
圖5 內核驅動一般架構模塊功能設計
3.2.4 具體驅動模塊主要功能及實施機制
具體驅動模塊包含內核中幾百種驅動程序的驅動程序名稱、文件路徑、功能描述、注冊函數(shù)、程序執(zhí)行流程等詳細信息,這些數(shù)據(jù)信息存儲在數(shù)據(jù)層的SQLite數(shù)據(jù)庫,此模塊用到了SQLTableModel 表格模型以及視圖,用于顯示和處理數(shù)據(jù)庫數(shù)據(jù).下面代碼的功能是輸入驅動程序名稱,查詢某個具體驅動的詳細信息.
3.2.5 視頻學習模塊主要功能及實施機制
視頻學習模塊,將驅動程序開發(fā)的基礎知識的相關視頻,存儲到FTP 服務器上,用戶點擊視頻學習,程序將自動連接服務器獲取相關視頻,并加載到Qt 視頻界面中的視頻播放列表,用戶通過鼠標點擊觸發(fā)事件,選擇播放的視頻,在此模塊中用到了Qt的事件系統(tǒng)-鼠標事件、定時器、信號和槽機制等.下面代碼是此模塊各個信號和槽函數(shù)的connect()連接.
3.2.6 網絡請求模塊主要功能及實施機制
網絡請求模塊,主要功能是請求網絡,確認網絡是否連接,是由QNetWorkRequest 類表示.下面是判斷網絡是否連接的代碼,能ping 通百度說明網絡已連接,通過QTable 顯示.
3.2.7 驅動詳細分類模塊主要功能及實施機制
內核中有成百上千個驅動程序,但這些驅動不是雜亂無章而是有規(guī)則分類的,此模塊包含108 類驅動程序的功能描述,便于用戶分類、查看和學習.用SQLite 數(shù)據(jù)庫存儲這108 類驅動程序的信息.圖6是驅動詳細分類模塊的數(shù)據(jù)庫設計.
圖6 驅動詳細分類模塊的數(shù)據(jù)庫設計
3.2.8 設置模塊主要功能及實施機制
設置模塊包含計算機信息和系統(tǒng)升級檢測兩個子模塊.其中升級檢測模塊,將系統(tǒng)的新版本放在服務器上,同時編寫一個JSON 文件,里面存放新舊版本的信息,包含版本號、程序下載地址、更新時間版本說明等,Qt 程序通過解析JSON 文件,比對版本號,確定是否有更新,彈出更新對話框,用戶選擇更新與否,此模塊用到了Qt 技術的網絡編程、JSON 解析、信號的自動連接等.計算機信息模塊通過system()調用、Linux管道機制實現(xiàn)對系統(tǒng)信息的獲取,包括計算機名稱、本地IP和用戶名、MAC 地址、CPU 信息、處理器個數(shù)、類型及版本等.圖7是計算機信息模塊設計圖.
圖7 計算機信息展示界面設計圖
在系統(tǒng)設計中用到了Qt的信號和槽機制、事件機制、GUI 策略、數(shù)據(jù)處理等技術,最終完成驅動程序學習系統(tǒng)的設計.信號和槽機制是Qt的核心特征,可用于兩個對象之間的通信.當某個事件發(fā)生時比如點擊事件,會發(fā)出一個信號,當信號發(fā)出時,與之相連的槽函數(shù)會自動回調.圖8為Qt的信號和槽機制.
圖8 Qt的信號和槽機制
信號和槽機制的特點如下:
⑴一個信號可以和多個槽相連,多個信號也可以與一個槽相連;
⑵信號也可以連接到信號.當發(fā)出一個信號時,將觸發(fā)另一信號;
⑶一個類的信號可以和其他類的信號相連.
以下代碼是視頻學習模塊中請求網絡讀取數(shù)據(jù)的代碼.
代碼中connect(manager,SIGNAL(finished(QNetwork Reply*)),this,SLOT(replyFinished(QNetworkReply*)))將信號finished (QNetworkReply*)與槽replyFinished(QNetwo-rkReply*)相連,當觸發(fā)finish()信號是會自動回調replyFinished 槽.
事件是可以被控件識別的操作,如按下確定按鈕、選擇某個單選按鈕或復選框.Qt 事件是一個QEvent對象,用于描述程序內部或外部發(fā)生的動作.Qt 事件產生的類型包括Qt 自身產生的事件、鍵盤鼠標事件、繪制事件等,目前處理event 最常用的方法是重新實現(xiàn)paintEvent()、mousePressEvent()和keyPressEvent()等事件處理函數(shù).
下面代碼是視頻學習模塊鼠標點擊視頻列表選取視頻的mousePressEvent 事件處理函數(shù).
void VedioSlider::mousePressEvent(QMouseEvent*ev)
{
//應先調用父類的鼠標點擊處理事件,這樣可以不影響拖動的情況
QSlider::mousePressEvent(ev);
//獲取鼠標的位置,這里并不能直接從ev 中取值
double pos=ev->pos().x()/ (double)width();
setValue(pos * (maximum()- minimum())+minimum());
//發(fā)送自定義的鼠標單擊信號
emit costomSliderClicked();
}
在數(shù)據(jù)庫查詢以及網絡編程模塊都用到了Qt的多線程技術,多線程技術可以輕松地開發(fā)可移植的多線程Qt 應用程序,可以充分利用多處理器的機器,也可以有效解決在不凍結一個應用程序界面的情況下執(zhí)行一個耗時操作的問題.Qt 提供了與平臺無關的線程類,在系統(tǒng)中與線程相關的最重要的類是QThread類,該類提供了創(chuàng)建一個新線程以及控制線程運行的各種方法,它是所有線程類的基礎,該類提供了很多API 對線程進行操作,每一個QThread 對象都代表一個線程,同時QThread 類是最常用的Qt 多線程處理方法.Qt 還提供了QTConcurrent 模塊,QTConcurrent是高級API,該模塊中有很多高級函數(shù)用于處理一些常見的并行計算模式,無需使用低級線程原語,例如:互斥、讀寫鎖、等待條件或信號量.在驅動程序學習系統(tǒng)中在查詢數(shù)據(jù)庫操作時用到的多線程技術簡單,且并行處理計算量小,故采用QTread類即可.
如圖9所示是系統(tǒng)中驅動程序信息查詢、操作數(shù)據(jù)庫的多線程編程的流程圖.當用戶查詢某個驅動程序的具體信息時,進入Qt 數(shù)據(jù)庫入口,加載SQL 數(shù)據(jù)庫驅動,然連接數(shù)據(jù)庫,之后分有兩個分支,一個是Qt 主線程事件,另一個是數(shù)據(jù)查詢子線程,創(chuàng)建子線程QTread,重載QTread:run(),在run()函數(shù)中創(chuàng)建QSqlTableModel表格模型,查詢數(shù)據(jù)表,輸出到表格模型,然后根據(jù)用戶輸入的模塊名進行篩選查詢某個驅動程序的詳細信息,在主線程中調用子線程,執(zhí)行mythread.start()函數(shù),在Qt 窗口顯示.
圖9 多線程流程圖
通過交叉編譯方式,使系統(tǒng)運行于X86、ARM、MIPS 三種平臺.當然也運行于Windows 平臺上.圖10是系統(tǒng)的登錄界面,圖11是系統(tǒng)主界面圖.
下面挑選部分功能模塊進行結果演示.圖12是視頻學習模塊,這個功能模塊包含驅動程序開發(fā)和案例的多個視頻,研發(fā)人員和用戶可以根據(jù)自身因素進行選擇性學習.
圖13是具體驅動模塊,包含200 多種常用驅動程序,每種驅動包含驅動程序名稱、文件路徑、功能描述、注冊函數(shù)、執(zhí)行流程等詳細信息,用SQLTableModel表格模型、視圖顯示,輸入具體驅動程序名稱,就可以查詢驅動名稱對應的驅動程序的具體信息.
圖10 系統(tǒng)登錄界面
圖11 系統(tǒng)主界面
圖12 視頻學習模塊
圖13 具體驅動信息
圖14是系統(tǒng)設置模塊,此功能模塊包含計算機信息、系統(tǒng)更新兩個子模塊,點擊系統(tǒng)更新,就會彈出檢查更新提示,若檢測到新版本會有提示,用戶可以選擇去下載或者不更新.下載時通過代碼連接遠程服務器,更新的版本會放到服務器上.
圖14 系統(tǒng)設置
圖15是遠程文件下載和上傳模塊,輸入服務器地址、用戶名、密碼登錄到FTP 服務器,用戶可以看到遠程服務器上可見的目錄或文件,然后選擇下載.
圖15 遠程文件下載和上傳
本文采用Qt的進程間通信技術、多線程技術、數(shù)據(jù)庫技術、網絡通信技術、多媒體技術、Linux 管道技術等,設計并實現(xiàn)了運行于麒麟操作系統(tǒng)下的內核驅動程序學習系統(tǒng).在設計與實現(xiàn)中涉及有Qt和C++語言、軟件算法、Linux 操作系統(tǒng)命令、FTP 通信、TCP 網絡通信、計算機硬件系統(tǒng)架構等知識層面.經過測試,系統(tǒng)能夠穩(wěn)定運行,用戶端界面效果良好.該系統(tǒng)主要用于國產麒麟系統(tǒng),能體現(xiàn)出其巨大的價值,填補了驅動研究與學習、適配等方面的短板,用于企業(yè)將大大減少驅動的維護成本,減少新人的學習時間,降低系統(tǒng)的開發(fā)周期等,促進國產Linux 操作系統(tǒng)的普及與推廣.用于高校將有助于學生快速掌握驅動程序學習知識,深入了解驅動程序開發(fā)思路,掌握每種驅動程序的執(zhí)行流程等,同時為國產操作系統(tǒng)儲備人才.當然此系統(tǒng)還存在一些潛在的不足,還需繼續(xù)改進、補充和完善,請批評指正.