從RTOS到Linux的應用移植

2020-12-06 電子產品世界

引言

  在過去幾年中,Linux成功地取代了一些最主要的傳統RTOS(實時作業系統)平臺,成為了各種各樣的嵌入式設備和應用中首選的嵌入式作業系統。儘管一度曾被認為是不重要的平臺,但今天嵌入式Linux已經成為主流,廣泛應用於消費電子、手持和無線設備、數據聯網以及電信設備等領域。Google公司在2007年11月發布的Android手機作業系統正是基於Linux內核的作業系統,使得Linux在數字行動電話業取得跨越式發展。

  筆者在從臺式頻譜儀到手持式頻譜儀的項目研發中實現了RTOS到Linux的應用移植。本文介紹了整體的設計思路和一些關鍵問題的實現細節。

1 RTOS到Linux的移植分析

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

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

  根據兩類系統的體系結構,RTOS移植到Linux的基本框架如圖1所示。

圖1 RTOS移植到Linux的基本框架
  由圖1可看出,移植的基本步驟為:
① RTOS的全部應用代碼移植到一個Linux單進程;
② RTOS的任務轉換成Linux線程;
③ RTOS的物理地址空間映射到Linux的虛擬地址空間。
  在具體的應用移植過程中,還應考慮在Linux系統下解決上層應用實時響應底層硬體中斷,應用層與內核層的異步通信、數據交換,以及多進程、多線程的設計等問題。

2 RTOS到Linux的移植實現

2.1 地址映射

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

  對於當前包含MMU的處理器而言,Linux系統提供了複雜的存儲管理系統,使得進程所能訪問的虛擬內存達到4 GB。

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

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

  Linux內核訪問外設I/O資源的方式有兩種:靜態映射(map_desc)和動態映射(ioremap)。對於靜態映射,內核在系統啟動時通過map_desc結構體靜態創建I/O資源到內核地址空間的線性映射表(即page table),這種映射表是一一映射的關係。開發人員可以自定義該I/O內存資源映射後的虛擬地址。創建好了靜態映射表,在內核或驅動中訪問該I/O資源時則無需再進行ioremap映射,可以直接通過映射後的I/O虛擬地址去訪問它。

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

#define bcon*(volatile unsigned long*)ioremap(0x56000010,4)//動態映射
上述代碼的含義是將0x56000010開始的4位元組的物理地址映射到內核的虛擬地址中,返回的起始虛擬地址值賦給bcon宏定義。對宏定義的操作即對物理地址的操作。
ioremap宏定義在asm/io.h內:
#define ioremap(addr, size)__ioremap(addr, size, 0)
__ioremap函數原型為(arm/mm/ioremap.c):
void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags);

其中,phys_addr為要映射的起始的I/O地址;size為要映射的空間的大小;flags為要映射的I/O空間和權限有關的標誌。

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

2.2 多進程多線程設計

  大多數的RTOS內核都提供多任務的管理機制。任務是一個具有獨立功能的無限循環的程序段的一次運行活動,是實時內核調度的單位。多任務在內核的管理、調度下並行執行,而且任務都是無限循環的,持續實現其功能。多任務實時作業系統示意圖如圖2所示。

圖2 多任務實時作業系統示意圖

  在比較兩類嵌入式系統的架構之後,移植的過程中很自然地將RTOS的多任務轉換成Linux的多進程、多線程。

  進程是Linux系統資源管理的最小單位,是程序的一次執行過程,是Linux資源分配的基本單位。線程是在進程內部,它是比進程更小的能獨立運行的基本單位,是Linux系統分配CPU時間的基本單位。線程比進程更節約資源,節約時間。在具體的移植過程中,採用主進程等待上層連接,主進程下多線程並行執行。同時採用互斥信號量解決線程訪問資源的同步問題。

  Linux主進程程序流程如圖3所示。

圖3 Linux主進程程序流程

2.3 應用層與內核層通信

  由於RTOS的單地址空間模式使得其內核層與應用層沒有區別,所以在數據交換、實時響應等方面有一定的優勢。而Linux系統提供了嚴格的內存管理機制,能保證系統更加穩定地運行。但同時增加了應用層與內核層,以及應用層與底層硬體通信的難度。本節內容主要解決應用層與內核層的信號通知、數據交換這兩個關鍵問題。

2.3.1  異步信號通知機制

  RTOS是對外來事件在限定時間內能作出反應的系統。在RTOS中,時間是一種重要的系統資源,對外部事件的響應和任務的執行都必須在限定的時間內完成。在多機系統中,還必須在限定的時間內完成消息的發送和接收。在RTOS中,輸出結果的正確性不僅取決於計算所形成的邏輯結束,還要取決於結果產生的時間。

  Linux在發行最初並未定義為一款實時作業系統。隨著Linux內核的不斷發展,如今穩定的Linux2.6內核已經具備了很好的實時響應能力。本文的研究項目中,需要上層應用對底層硬體進行實時響應。RTOS並沒有嚴格區分上層應用和內核,其多任務並行執行,能很好達地到實時響應的目的。而移植到Linux系統中,上層應用和底層硬體並不能直接通信,要經過內核驅動層。雖然可以採用查詢方式實現,但是實時性不高,同時浪費CPU資源。本文採用異步信號通知機制,實現了上層應用對底層硬體的實時響應。

  異步通知[2]的意思是:一旦設備就緒,則主動通知應用程式,這樣應用程式根本不需要查詢設備狀態,這一點非常類似於硬體上「中斷」的概念,比較準確的稱謂是「信號驅動的異步I/O」。信號是在軟體層次上對中斷機制的一種模擬,在原理上進程收到信號與處理器收到中斷請求是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,原理如圖4所示。

圖4 異步信號通知示意圖

  在具體的程序設計過程中,上層應用為了能處理一個設備釋放的信號,要完成3項工作:

① 通過F_SETOWN控制命令設置設備文件的擁有者為本進程,這樣從設備驅動發送的信號才能被本進程接收到。

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

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

  在上層應用設置捕獲信號後,還應在設備驅動端設置信號源,在合適的時機讓設備驅動釋放信號,其相關代碼也包括3部分:

① 支持F_SETOWN命令,能在這個控制命令處理中設置filp﹥f_owner為對應進程ID。

② 支持F_SETFL命令的處理,每當FASYNC標誌改變時,驅動程序中的fasync()函數將得以執行。

③ 在設備資源可獲得時,調用kill_fasync()函數釋放相應的信號給上層應用。

  上述3項工作和上層應用的3項工作是一一對應的。按其步驟設計程序,即可實現上層應用通過內核層對底層硬體的及時響應。

2.3.2 proc方式數據共享

  除了前面提到的信號、套接字、信號量外,Linux還有管道、報文隊列、共享內存等進程間通信機制。在移植過程中,由於Linux系統分為應用層和內核層,所以不僅要進行進程間的通信,還要實現應用層與內核層的數據交換。以上的機制多是基於進程間通信,並不能很好地滿足要求。在這裡採用proc文件系統的方法在Linux內核層和應用層之間進行數據交換。

  在Linux系統中,proc文件系統是一個虛擬文件系統,用於內核向用戶導出信息。利用proc文件系統通信是比較方便的一種應用層與內核層的數據交換方式,可以將對虛擬文件的讀寫作為與內核中實體進行通信的一種手段。內核的很多數據都是通過這種方式出口給上層應用的,內核的很多參數也是通過這種方式來讓上層方便設置的。實際上,很多應用嚴重地依賴於proc文件系統,因此它幾乎是必不可少的組件。

  對於proc文件系統的使用,有如下的接口函數:
struct proc_dir_entry *create_proc_entry(const char *name,mode_t mode,struct proc_dir_entry *parent);
typedef int (read_proc_t) (char *page, char **start, off_t off, int count, int *eof, void *data);
typedef int (write_proc_t) (struct file *file, const char __user *buffer,unsigned long count, void *data);
void remove_proc_entry(const char *name, struct proc_dir_entry *parent);

  以上函數作用分別是創建proc文件系統節點、讀寫proc節點,以及刪除proc節點。具體移植的proc程序流程如圖5所示。

圖5 proc程序流程

2.4 調試運行

  根據移植的基本框架,在解決了以上幾個關鍵問題後,基本完成了整個移植的過程。最後要做的就是程序的調試。對於程序語法的調試,在編譯的過程中解決。根據Linux平臺下的編譯器gcc的提示信息,修改出現的語法類錯誤。在保證了應用程式文件的成功編譯後,採用gdb調試軟體進行功能的調試,同時結合列印函數printf跟蹤調試。在程序適當的位置加入printf列印信息,例如根據創建proc節點的返回值來列印成功或者失敗的信息,可以很直觀地了解程序的運行情況,是很有效的調試方法。通過兩種手段的結合,最後完成應用程式的調試。結果表明,能夠在Linux系統下正常運行。

結語

  現在越來越多的開發團隊正在放棄第一代實時作業系統,選擇更穩定的開放式的嵌入式Linux平臺。參考本文概括的應用程式的移植步驟以及相關的關鍵技術,開發人員可以通過更少的時間,將以前的RTOS的代碼成功地移植到一個現代化的Linux平臺上來。

本文引用地址:http://www.eepw.com.cn/article/257179.htm

linux作業系統文章專題:linux作業系統詳解(linux不再難懂)

linux作業系統文章專題:linux作業系統詳解(linux不再難懂)

linux相關文章:linux教程


相關焦點

  • net-snmp移植到arm
    關於net-snmp的移植,是基於靜態編譯的,動態的沒有做成功,在arm上的移植過程大致如下:如果沒有涉及到擴展agent,則藍色字體不需要理會。-5.4.4/agent/mibgroup路徑下;2.CC=arm-linux-gcc .
  • Linux2.6內核驅動移植參考
    如果需要該文檔的word版的朋友, 請mail到weiriver@sohu.com索 取。8、 設備號 kdev_t被廢除不可用,新的dev_t拓展到了32位,12位主設備號,20位次設備號。dev, unsigned count); (分別為,申請cdev結構,和fops連接,將設備加入到系統中!
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    前段時間有黑客成功的把Linux移植到一個佳能照相機上。並且在這個照相機上運行了一些主流的軟體。可以說。只要有足夠可以利用的硬體資源。就可以把Linux移植到這個硬體平臺上去。這個資源的最低要求往往很低。這可以與對硬體資源要求很高的Windows有一個鮮明的對比。舉個例子就是。當Windows 10的升級提示從你計算機的右下角彈出時。你可以不假思索的點擊『馬上升級』嗎?
  • 如何在 Linux 上安裝微軟 Windows 計算器
    Uno Platform 社區的好人們已經將開源的 Windows 計算器移植到了• 來源:linux.cn • 作者:Brian Fagioli • 譯者:Xingyu.Wang •(本文字數:1026,閱讀時長大約:1 分鐘)微軟不再是 Linux 或
  • 基於Linux系統的多種串行總線統一接口的實現
    統一接口的應用層API與底層的具體總線操作形式無關,而且便於應用系統的升級和移植。文中給出了一種多種串行總線統一接口的實現方法,並以ARM9為平臺,以I2C、1-Wire、SPI為例,驗證了新方法的可行性。
  • 嵌入式linux新手入門手記-準備qt5.4.1開發平臺
    為保證和ubuntu平臺的一致性,決定am335x的平臺移植qt5.4.1,首先到qt的官網下載原始碼:http://download.qt.io/official_releases/qt/5.4/5.4.1/single/qt-everywhere-opensource-src-5.4.1.tar.gz。下載可以使用git,也可以用瀏覽器直接打開這個連接。
  • Linux系統的Linux應該怎麼讀?正確讀法在這裡,很多人都讀錯了!
    1、linux發音五花八門版本頗多,見到和聽到的不下10種。根據linux的創始人Linus Torvalds的說法,Linux的發音和「Minix」是押韻的。3、有人綜合網上和linux自己的讀音,概括出幾個自認為最合適也最通用的讀法:/li'n^ks/(「裡那克斯」)或/'li:nэks/(「裡訥克斯」)或/li'nju:ks/(「裡紐克斯」)。4、這幾個應該是誰都聽得懂的。至於哪個比較正宗,當然是linux的原因。但事實上使用linux哪種讀法的人似乎都不在少數。
  • 嵌入式Linux的GDB調試環境建立
    這樣,應用程式在嵌入式目標系統上運行,而gdb調試在Host端,所以要採用遠程調試(remote)的方法。本文引用地址:http://www.eepw.com.cn/article/76982.htm    一、建立安裝gdb組件    從ftp://ftp.gnu.org/gnu/gdb上下載gdb套件,我下載的是gdb-5.2.1.tar.gz。
  • 「linux專欄」嘔心瀝血兩天,就為linux中安裝拼音輸入法
    之前呢,小編也百度過,都說直接下載linux版本的搜狗輸入法之後,直接點擊sougoupinyin.deb的安裝文件就能直接安裝。但是,事實卻很扎心,小編的REHL8作業系統系統並不支持這樣的操作,點擊之後反而是打開了安裝包,並沒有進入安裝程序。
  • linux下安裝虛擬機,完美在linux系統下運行通達信軟體
    現在越來越多的人使用linux系統,現在很多的國產作業系統都是基於linux內核上的。雖說不少的軟體都可以運行在linux的系統上。但是對於股票軟體來說在linux上的使用是一個硬傷。能夠運行在linux下的國內股票軟體少之又少。
  • 萬物皆可Linux:開發者要為Apple Silicon Mac移植Linux系統
    秉承著「萬物皆可 Linux」的理念,知名開發者赫克託·馬丁(Hector Martin)正發起眾籌項目,計劃為 Apple Silicon Mac 設備移植 Linux 系統。Martin(網名為Marcan)近日在 Patreon 上創建了一個眾籌項目,希望籌足資金以便於在裝備 M1 晶片的 Mac 設備上移植 Linux 系統。然而移植 Linux 並不是簡單的事情,Linux Torvalds 甚至曾公開表示,移植是不太可能的。
  • linux下SCP指令的使用
    SCP常用實例(在linux的centos環境下為例,從192.168.200.10現在一個文件到本地)1、從遠程伺服器下載文件到本地伺服器。scp 用戶名@IP位址:/home/1.txt ./2、linux下,通過指定埠從遠程伺服器下載文件到本地。scp -oPort=埠號 用戶名@IP位址:/opt/ftp-0.17-54.el6.x86_64.rpm ./3、linux下,通過指定埠將本地文件,上傳到遠程伺服器指定目錄下。
  • 造血幹細胞移植技術的發現和應用
    骨髓移植技術的發現 生命科學是二十世紀發展最為迅猛的學科之一,已經成為自然科學中最引人注目的領域。1957 年,美國華盛頓大學多納爾·託瑪斯發現正常人的骨髓移植到病人體內,可以治療造血功能障礙。這一技術的發現,使多納爾·託瑪斯本人榮獲了諾貝爾獎。 這一技術很快得到全世界的認可,並已成為根治白血病等病的主要手段。造血幹細胞移植技術的發現和應用為人類戰勝疾病帶來新的希望。 什麼是造血幹細胞?
  • Linux下如何掛載新磁碟:mount
    前言在linux系統伺服器上插了一個U盤,結果系統顯示不出來,是什麼原因導致了系統不能識別U盤呢?經過一番搜索,發現新的硬體設備插在linux系統上時,如果不能正常顯示,則需要通過掛載讓U盤顯示出來,這裡就用到了我們今天要介紹的命令:mount。
  • Linux下內存洩漏工具
    嵌入式linux QQ交流群:175159209,歡迎愛好者加入交流技術問題!
  • 如果我們力推深度Linux系統,會取代微軟的Windows系統嗎?
    當linux遇上Windows孰強孰弱實際上,很多人對於windows的看法是,它更適合單個的用戶;而linux適合的是喜歡倒騰電腦的用戶。會覺得linux有點難度,windows簡單很多,雖然微軟的windows有太多的弊端了,可是你得知道的是,大部分用戶還是選擇了微軟,驅動多,操作簡單,更傻瓜式。
  • 數字溫度傳感器DS1621在Linux下的IIC接口驅動設計
    IIC總線作為一種申行傳輸總線,其使用連線少,結構簡單,是一種應用廣泛的高性能總線方式。而Linux作為一個原始碼公開、易於裁剪的作業系統,非常適合於嵌入式系統的應用。
  • Linux下常用的研發工具和環境
    其中Qt Designer是利用Qt組件設計或構建GUI的工具;Qt Assistant是個幫助文獻性質的工具;Qt Linguist是為應用程式的本地化提供的圖形界面工具;qmake是一個能夠幫助簡化跨平臺的研發項目的編譯過程的工具。
  • 基於嵌入式Linux的語音識別系統硬軟體設計
    在實際應用中,現代技術開發嵌入式語音識別有兩種實現方式:調入嵌入式語音開發包和外擴語音識別晶片。本文的語音識別系統方案是以嵌入式處理器S3C2440為核心,外擴非特定人語音識別晶片LD3320,並將超聲波測距模塊和雲臺相結合作為系統的機械執行機構。