亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        從RTOS到Linux的應(yīng)用移植※

        2012-06-25 02:45:56李瑋瑩姚興偉
        關(guān)鍵詞:應(yīng)用層內(nèi)核進(jìn)程

        李瑋瑩,姚興偉

        (電子科技大學(xué) 空天科學(xué)技術(shù)研究院,成都 611731)

        李瑋瑩,主要研究方向?yàn)榈孛嬲緶y試系統(tǒng)開發(fā);姚興偉(碩士研究生),主要研究方向?yàn)榍度胧较到y(tǒng)設(shè)計(jì)、設(shè)備驅(qū)動開發(fā)。

        引 言

        在過去幾年中,Linux成功地取代了一些最主要的傳統(tǒng)RTOS(實(shí)時(shí)操作系統(tǒng))平臺,成為了各種各樣的嵌入式設(shè)備和應(yīng)用中首選的嵌入式操作系統(tǒng)。盡管一度曾被認(rèn)為是不重要的平臺,但今天嵌入式Linux已經(jīng)成為主流,廣泛應(yīng)用于消費(fèi)電子、手持和無線設(shè)備、數(shù)據(jù)聯(lián)網(wǎng)以及電信設(shè)備等領(lǐng)域。Google公司在2007年11月發(fā)布的Android手機(jī)操作系統(tǒng)正是基于Linux內(nèi)核的操作系統(tǒng),使得Linux在數(shù)字移動電話業(yè)取得跨越式發(fā)展。

        筆者在從臺式頻譜儀到手持式頻譜儀的項(xiàng)目研發(fā)中實(shí)現(xiàn)了RTOS到Linux的應(yīng)用移植。本文介紹了整體的設(shè)計(jì)思路和一些關(guān)鍵問題的實(shí)現(xiàn)細(xì)節(jié)。

        1 RTOS到Linux的移植分析

        幾乎所有的RTOS都有一個(gè)簡單的編程模型,它由多線程的執(zhí)行(通常稱為任務(wù))構(gòu)成,包含在單一的地址空間中。在RTOS中,單一主程序下多任務(wù)同時(shí)運(yùn)行,具有很高的實(shí)時(shí)響應(yīng)能力。

        過去大多數(shù)嵌入式處理器沒有內(nèi)存管理單元,因此RTOS是單地址空間模式,即它們的物理地址和邏輯地址都是一樣的。然而目前大多數(shù)的中高端處理器配備了MMU(內(nèi)存管理單元)。在 MMU的支持下,Linux采用虛擬內(nèi)存管理,將地址空間分為物理地址和虛擬地址,因此系統(tǒng)操作硬件時(shí)要進(jìn)行地址映射。

        根據(jù)兩類系統(tǒng)的體系結(jié)構(gòu),RTOS移植到Linux的基本框架如圖1所示。

        圖1 RTOS移植到Linux的基本框架

        由圖1可看出,移植的基本步驟為:

        ①RTOS的全部應(yīng)用代碼移植到一個(gè)Linux單進(jìn)程;

        ②RTOS的任務(wù)轉(zhuǎn)換成Linux線程;

        ③RTOS的物理地址空間映射到Linux的虛擬地址空間。

        在具體的應(yīng)用移植過程中,還應(yīng)考慮在Linux系統(tǒng)下解決上層應(yīng)用實(shí)時(shí)響應(yīng)底層硬件中斷,應(yīng)用層與內(nèi)核層的異步通信、數(shù)據(jù)交換,以及多進(jìn)程、多線程的設(shè)計(jì)等問題。

        2 RTOS到Linux的移植實(shí)現(xiàn)

        2.1 地址映射

        多數(shù)RTOS是針對較早的無MMU的CPU而設(shè)計(jì),所以忽略了內(nèi)存管理部分,即使當(dāng)MMU問世后也是這樣——不區(qū)分物理地址和虛擬地址。大多數(shù)RTOS還全部運(yùn)行在特權(quán)模式,雖然表面上看來是增強(qiáng)了性能,但全部的RTOS應(yīng)用和系統(tǒng)代碼都能夠訪問整個(gè)地址空間、內(nèi)存映射過的設(shè)備以及其他I/O操作。這樣,即使存在差別,也很難把RTOS應(yīng)用程序代碼同驅(qū)動程序代碼區(qū)分開來。

        對于當(dāng)前包含MMU的處理器而言,Linux系統(tǒng)提供了復(fù)雜的存儲管理系統(tǒng),使得進(jìn)程所能訪問的虛擬內(nèi)存達(dá)到4GB。

        在Linux系統(tǒng)中,進(jìn)程的4GB虛擬內(nèi)存空間[1]被分為兩個(gè)部分——用戶空間與內(nèi)核空間。用戶地址空間一般分布為0~3GB,剩下的3~4GB為內(nèi)核空間。上層應(yīng)用程序通常情況下只能訪問用戶空間的虛擬地址,不能訪問內(nèi)核空間的虛擬地址。應(yīng)用程序只有通過系統(tǒng)調(diào)用(代表應(yīng)用程序進(jìn)程在內(nèi)核態(tài)執(zhí)行)等方式才可以訪問到內(nèi)核空間。

        而外設(shè)I/O資源是不在Linux內(nèi)核虛擬地址空間中的(如SRAM或硬件接口寄存器等),若需要訪問某外設(shè)I/O資源,必須先將其物理地址映射到內(nèi)核虛擬地址空間中,然后才能在內(nèi)核空間中訪問它。

        Linux內(nèi)核訪問外設(shè)I/O資源的方式有兩種:靜態(tài)映射(map_desc)和動態(tài)映射(ioremap)。對于靜態(tài)映射,內(nèi)核在系統(tǒng)啟動時(shí)通過map_desc結(jié)構(gòu)體靜態(tài)創(chuàng)建I/O資源到內(nèi)核地址空間的線性映射表(即page table),這種映射表是一一映射的關(guān)系。開發(fā)人員可以自定義該I/O內(nèi)存資源映射后的虛擬地址。創(chuàng)建好了靜態(tài)映射表,在內(nèi)核或驅(qū)動中訪問該I/O資源時(shí)則無需再進(jìn)行ioremap映射,可以直接通過映射后的I/O虛擬地址去訪問它。

        這里主要討論更常用的動態(tài)映射方式。動態(tài)映射方式是直接通過內(nèi)核提供的ioremap函數(shù)動態(tài)創(chuàng)建一段外設(shè)I/O內(nèi)存資源到內(nèi)核虛擬地址的映射表,從而可以在內(nèi)核空間中訪問這段I/O資源。代碼如下:

        上述代碼的含義是將0x56000010開始的4字節(jié)的物理地址映射到內(nèi)核的虛擬地址中,返回的起始虛擬地址值賦給bcon宏定義。對宏定義的操作即對物理地址的操作。

        其中,phys_addr為要映射的起始的I/O地址;size為要映射的空間的大??;flags為要映射的I/O空間和權(quán)限有關(guān)的標(biāo)志。

        該函數(shù)返回映射后的內(nèi)核虛擬地址(3G~4G),接著便可以通過讀寫該返回的內(nèi)核虛擬地址去訪問這段I/O內(nèi)存資源。所以,在移植的開始就應(yīng)該在頭文件中完成設(shè)備物理地址的映射,方便后續(xù)的開發(fā)。

        2.2 多進(jìn)程多線程設(shè)計(jì)

        大多數(shù)的RTOS內(nèi)核都提供多任務(wù)的管理機(jī)制。任務(wù)是一個(gè)具有獨(dú)立功能的無限循環(huán)的程序段的一次運(yùn)行活動,是實(shí)時(shí)內(nèi)核調(diào)度的單位。多任務(wù)在內(nèi)核的管理、調(diào)度下并行執(zhí)行,而且任務(wù)都是無限循環(huán)的,持續(xù)實(shí)現(xiàn)其功能。多任務(wù)實(shí)時(shí)操作系統(tǒng)示意圖如圖2所示。

        圖2 多任務(wù)實(shí)時(shí)操作系統(tǒng)示意圖

        在比較兩類嵌入式系統(tǒng)的架構(gòu)之后,移植的過程中很自然地將RTOS的多任務(wù)轉(zhuǎn)換成Linux的多進(jìn)程、多線程。

        進(jìn)程是Linux系統(tǒng)資源管理的最小單位,是程序的一次執(zhí)行過程,是Linux資源分配的基本單位。線程是在進(jìn)程內(nèi)部,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,是Linux系統(tǒng)分配CPU時(shí)間的基本單位。線程比進(jìn)程更節(jié)約資源,節(jié)約時(shí)間。在具體的移植過程中,采用主進(jìn)程等待上層連接,主進(jìn)程下多線程并行執(zhí)行。同時(shí)采用互斥信號量解決線程訪問資源的同步問題。

        Linux主進(jìn)程程序流程如圖3所示。

        圖3 Linux主進(jìn)程程序流程

        2.3 應(yīng)用層與內(nèi)核層通信

        由于RTOS的單地址空間模式使得其內(nèi)核層與應(yīng)用層沒有區(qū)別,所以在數(shù)據(jù)交換、實(shí)時(shí)響應(yīng)等方面有一定的優(yōu)勢。而Linux系統(tǒng)提供了嚴(yán)格的內(nèi)存管理機(jī)制,能保證系統(tǒng)更加穩(wěn)定地運(yùn)行。但同時(shí)增加了應(yīng)用層與內(nèi)核層,以及應(yīng)用層與底層硬件通信的難度。本節(jié)內(nèi)容主要解決應(yīng)用層與內(nèi)核層的信號通知、數(shù)據(jù)交換這兩個(gè)關(guān)鍵問題。

        2.3.1 異步信號通知機(jī)制

        RTOS是對外來事件在限定時(shí)間內(nèi)能作出反應(yīng)的系統(tǒng)。在RTOS中,時(shí)間是一種重要的系統(tǒng)資源,對外部事件的響應(yīng)和任務(wù)的執(zhí)行都必須在限定的時(shí)間內(nèi)完成。在多機(jī)系統(tǒng)中,還必須在限定的時(shí)間內(nèi)完成消息的發(fā)送和接收。在RTOS中,輸出結(jié)果的正確性不僅取決于計(jì)算所形成的邏輯結(jié)束,還要取決于結(jié)果產(chǎn)生的時(shí)間。

        Linux在發(fā)行最初并未定義為一款實(shí)時(shí)操作系統(tǒng)。隨著Linux內(nèi)核的不斷發(fā)展,如今穩(wěn)定的Linux2.6內(nèi)核已經(jīng)具備了很好的實(shí)時(shí)響應(yīng)能力。本文的研究項(xiàng)目中,需要上層應(yīng)用對底層硬件進(jìn)行實(shí)時(shí)響應(yīng)。RTOS并沒有嚴(yán)格區(qū)分上層應(yīng)用和內(nèi)核,其多任務(wù)并行執(zhí)行,能很好達(dá)地到實(shí)時(shí)響應(yīng)的目的。而移植到Linux系統(tǒng)中,上層應(yīng)用和底層硬件并不能直接通信,要經(jīng)過內(nèi)核驅(qū)動層。雖然可以采用查詢方式實(shí)現(xiàn),但是實(shí)時(shí)性不高,同時(shí)浪費(fèi)CPU資源。本文采用異步信號通知機(jī)制,實(shí)現(xiàn)了上層應(yīng)用對底層硬件的實(shí)時(shí)響應(yīng)。

        異步通知[2]的意思是:一旦設(shè)備就緒,則主動通知應(yīng)用程序,這樣應(yīng)用程序根本不需要查詢設(shè)備狀態(tài),這一點(diǎn)非常類似于硬件上“中斷”的概念,比較準(zhǔn)確的稱謂是“信號驅(qū)動的異步I/O”。信號是在軟件層次上對中斷機(jī)制的一種模擬,在原理上進(jìn)程收到信號與處理器收到中斷請求是一樣的。信號是異步的,一個(gè)進(jìn)程不必通過任何操作來等待信號的到達(dá),原理如圖4所示。

        圖4 異步信號通知示意圖

        在具體的程序設(shè)計(jì)過程中,上層應(yīng)用為了能處理一個(gè)設(shè)備釋放的信號,要完成3項(xiàng)工作:

        ① 通過F_SETOWN控制命令設(shè)置設(shè)備文件的擁有者為本進(jìn)程,這樣從設(shè)備驅(qū)動發(fā)送的信號才能被本進(jìn)程接收到。

        ②通過F_SETFL控制命令設(shè)置設(shè)備文件支持FASYNC,即異步通知模式。

        ③ 通過signal()函數(shù)連接信號和信號處理函數(shù)。

        在上層應(yīng)用設(shè)置捕獲信號后,還應(yīng)在設(shè)備驅(qū)動端設(shè)置信號源,在合適的時(shí)機(jī)讓設(shè)備驅(qū)動釋放信號,其相關(guān)代碼也包括3部分:

        ① 支持F_SETOWN命令,能在這個(gè)控制命令處理中設(shè)置filp-﹥f_owner為對應(yīng)進(jìn)程ID。

        ② 支持F_SETFL命令的處理,每當(dāng)FASYNC標(biāo)志改變時(shí),驅(qū)動程序中的fasync()函數(shù)將得以執(zhí)行。

        ③ 在設(shè)備資源可獲得時(shí),調(diào)用kill_fasync()函數(shù)釋放相應(yīng)的信號給上層應(yīng)用。

        上述3項(xiàng)工作和上層應(yīng)用的3項(xiàng)工作是一一對應(yīng)的。按其步驟設(shè)計(jì)程序,即可實(shí)現(xiàn)上層應(yīng)用通過內(nèi)核層對底層硬件的及時(shí)響應(yīng)。

        2.3.2 proc方式數(shù)據(jù)共享

        除了前面提到的信號、套接字、信號量外,Linux還有管道、報(bào)文隊(duì)列、共享內(nèi)存等進(jìn)程間通信機(jī)制。在移植過程中,由于Linux系統(tǒng)分為應(yīng)用層和內(nèi)核層,所以不僅要進(jìn)行進(jìn)程間的通信,還要實(shí)現(xiàn)應(yīng)用層與內(nèi)核層的數(shù)據(jù)交換。以上的機(jī)制多是基于進(jìn)程間通信,并不能很好地滿足要求。在這里采用proc文件系統(tǒng)的方法在Linux內(nèi)核層和應(yīng)用層之間進(jìn)行數(shù)據(jù)交換。

        在Linux系統(tǒng)中,proc文件系統(tǒng)是一個(gè)虛擬文件系統(tǒng),用于內(nèi)核向用戶導(dǎo)出信息。利用proc文件系統(tǒng)通信是比較方便的一種應(yīng)用層與內(nèi)核層的數(shù)據(jù)交換方式,可以將對虛擬文件的讀寫作為與內(nèi)核中實(shí)體進(jìn)行通信的一種手段。內(nèi)核的很多數(shù)據(jù)都是通過這種方式出口給上層應(yīng)用的,內(nèi)核的很多參數(shù)也是通過這種方式來讓上層方便設(shè)置的。實(shí)際上,很多應(yīng)用嚴(yán)重地依賴于proc文件系統(tǒng),因此它幾乎是必不可少的組件。

        對于proc文件系統(tǒng)的使用,有如下的接口函數(shù):

        以上函數(shù)作用分別是創(chuàng)建proc文件系統(tǒng)節(jié)點(diǎn)、讀寫proc節(jié)點(diǎn),以及刪除proc節(jié)點(diǎn)。具體移植的proc程序流程如圖5所示。

        圖5 proc程序流程

        2.4 調(diào)試運(yùn)行

        根據(jù)移植的基本框架,在解決了以上幾個(gè)關(guān)鍵問題后,基本完成了整個(gè)移植的過程。最后要做的就是程序的調(diào)試。對于程序語法的調(diào)試,在編譯的過程中解決。根據(jù)Linux平臺下的編譯器gcc的提示信息,修改出現(xiàn)的語法類錯(cuò)誤。在保證了應(yīng)用程序文件的成功編譯后,采用gdb調(diào)試軟件進(jìn)行功能的調(diào)試,同時(shí)結(jié)合打印函數(shù)printf跟蹤調(diào)試。在程序適當(dāng)?shù)奈恢眉尤雙rintf打印信息,例如根據(jù)創(chuàng)建proc節(jié)點(diǎn)的返回值來打印成功或者失敗的信息,可以很直觀地了解程序的運(yùn)行情況,是很有效的調(diào)試方法。通過兩種手段的結(jié)合,最后完成應(yīng)用程序的調(diào)試。結(jié)果表明,能夠在Linux系統(tǒng)下正常運(yùn)行。

        結(jié) 語

        現(xiàn)在越來越多的開發(fā)團(tuán)隊(duì)正在放棄第一代實(shí)時(shí)操作系統(tǒng),選擇更穩(wěn)定的開放式的嵌入式Linux平臺。參考本文概括的應(yīng)用程序的移植步驟以及相關(guān)的關(guān)鍵技術(shù),開發(fā)人員可以通過更少的時(shí)間,將以前的RTOS的代碼成功地移植到一個(gè)現(xiàn)代化的Linux平臺上來。

        編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。

        [1]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2010.

        [2]宋寶華.Linuxs設(shè)備驅(qū)動開發(fā)詳解[M].2版.北京:人民郵電出版社,2010.

        [3]Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman.Linux Device Drivers [M].Third Edition.Sebastopol:O'Reilly Media,Inc.,2005.

        [4]NSLEYE.Real-time Linux[J].Dr.Dobb's Journal,2003,28(4):79-81.

        [5]李小群,趙慧斌,葉以民,等.RFRTOS:基于Linux的實(shí)時(shí)操作系統(tǒng)[J].軟件學(xué)報(bào),2003(7).

        [6]劉云新,張堯?qū)W.一個(gè)基于Linux的嵌入式實(shí)時(shí)操作系統(tǒng)[J].計(jì)算機(jī)工程與應(yīng)用,2001(7).

        [7]欒建海,李眾立,黃曉芳.Linux2.6內(nèi)核分析[J].兵工自動化,2005(2).

        猜你喜歡
        應(yīng)用層內(nèi)核進(jìn)程
        萬物皆可IP的時(shí)代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
        強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
        債券市場對外開放的進(jìn)程與展望
        中國外匯(2019年20期)2019-11-25 09:54:58
        基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
        Linux內(nèi)核mmap保護(hù)機(jī)制研究
        基于分級保護(hù)的OA系統(tǒng)應(yīng)用層訪問控制研究
        新一代雙向互動電力線通信技術(shù)的應(yīng)用層協(xié)議研究
        物聯(lián)網(wǎng)技術(shù)在信息機(jī)房制冷系統(tǒng)中的應(yīng)用
        社會進(jìn)程中的新聞學(xué)探尋
        Current advances in neurotrauma research: diagnosis, neuroprotection, and neurorepair
        麻豆人妻性色av专区0000| 国产一级在线现免费观看| 国产精品一区二区三密桃| 精品亚洲av乱码一区二区三区| 天堂中文а√在线| 日韩精品无码一区二区三区视频 | 99国产精品久久99久久久| 欧美精品videossex少妇| 亚洲中文字幕在线一区二区三区| 自拍偷拍一区二区三区四区| 蜜桃尤物在线视频免费看| 中文字幕在线精品视频入口一区| 最新国产乱视频伦在线| 青青草原亚洲在线视频| 亚洲精品成人网线在线播放va| 熟女不卡精品久久av| 国产精品成人无码久久久久久| a人片在线观看苍苍影院| 全部免费国产潢色一级| 性感的小蜜桃在线观看| 在线中文字幕乱码英文字幕正常| 性一乱一搞一交一伦一性| 无码吃奶揉捏奶头高潮视频| 丰满少妇被爽的高潮喷水呻吟| 亚洲av无码专区亚洲av网站| 夜先锋av资源网站| 国产美女69视频免费观看| 精品国产日产av在线| 无套内内射视频网站| 国产又黄又猛又粗又爽的a片动漫| 无码精品国产午夜| 熟女一区二区中文字幕| 小鲜肉自慰网站| 亚洲区日韩精品中文字幕| 国产精品女丝袜白丝袜美腿| 亚洲国产精品无码久久久| 精品久久久久久国产| 久久国产劲爆内射日本| 狠狠cao日日橹夜夜十橹| 国产乱人伦精品一区二区| 丝袜 亚洲 另类 欧美|