資料介紹
引言
在過去幾年中,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內存資源。所以,在移植的開始就應該在頭文件中完成設備物理地址的映射,方便后續的開發。
在過去幾年中,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內存資源。所以,在移植的開始就應該在頭文件中完成設備物理地址的映射,方便后續的開發。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- Linux系統移植技術入門 0次下載
- STM32移植UCOS RTOS的步驟方法 8次下載
- 基于TI AM5728 RTOS開發手冊
- [深度理解嵌入式linux系統移植]深度理解嵌入式linux系統移植
- 【Linux】嵌入式Linux系統的移植(上篇:交叉編譯器、連接方式)
- ATWILC器件Linux移植指南 8次下載
- 長文詳解嵌入式Linux系統移植資料下載
- 如何在DM6446 GPIO中進行LINUX的驅動移植詳細程序說明
- 如何吧Mysql數據庫移植到嵌入式Linux的詳細資料說明 4次下載
- 如何吧SQLite移植到嵌入式Linux系統的詳細資料說明 8次下載
- 如何吧tcpdump網絡抓包工具移植到嵌入式linux系統 6次下載
- 如何將SQLite移植到linux的方法程序說明概述 0次下載
- 將設計從MCP201移植到MCP2021A免費下載
- Linux ARM移植教程
- Linux-2.6.25移植
- RTOS與Linux到底有什么區別 2.1k次閱讀
- 深入解析Zephyr RTOS的技術細節 4.1k次閱讀
- 【從0開始創建AWTK應用程序】編譯應用到RTOS平臺 1.4k次閱讀
- 【AWTK開源智能串口屏方案】HMI端程序移植編譯及運行 1.9k次閱讀
- gdb本地調試版本移植至ARM-Linux系統 1.2k次閱讀
- RTOS核心:調度和分割 1.4k次閱讀
- 詳解選擇RTOS的要點 1.3k次閱讀
- 如何將ThreadX移植到STM32平臺 2.8k次閱讀
- 實操經驗分享——在STM32上移植Linux 1.4w次閱讀
- 從RTOS到嵌入式Linux的應用移植步驟以及相關的關鍵技術分析 3.8k次閱讀
- 如何在晶心平臺上建立Linux基礎架構? 1.1k次閱讀
- Linux內核的DL調度器的細節和怎么樣使用DL調度器? 6.3k次閱讀
- 為什么選擇Linux操作系統?制約標準Linux操作系統實時性的因素 6.1k次閱讀
- 如何將Linux2.4移植到ARM平臺的嵌入式系統 4.2k次閱讀
- 利用6 個 Linux 運維典型問題來分析處理問題的思路 3.4k次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
電子發燒友App





創作
發文章
發帖
提問
發資料
發視頻
上傳資料賺積分
評論