資料介紹
引言
在過(guò)去幾年中,Linux成功地取代了一些最主要的傳統(tǒng)RTOS(實(shí)時(shí)操作系統(tǒng))平臺(tái),成為了各種各樣的嵌入式設(shè)備和應(yīng)用中首選的嵌入式操作系統(tǒng)。盡管一度曾被認(rèn)為是不重要的平臺(tái),但今天嵌入式Linux已經(jīng)成為主流,廣泛應(yīng)用于消費(fèi)電子、手持和無(wú)線設(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ù)字移動(dòng)電話業(yè)取得跨越式發(fā)展。
筆者在從臺(tái)式頻譜儀到手持式頻譜儀的項(xiàng)目研發(fā)中實(shí)現(xiàn)了RTOS到Linux的應(yīng)用移植。本文介紹了整體的設(shè)計(jì)思路和一些關(guān)鍵問(wèn)題的實(shí)現(xiàn)細(xì)節(jié)。
1 RTOS到Linux的移植分析
幾乎所有的RTOS都有一個(gè)簡(jiǎn)單的編程模型,它由多線程的執(zhí)行(通常稱為任務(wù))構(gòu)成,包含在單一的地址空間中。在RTOS中,單一主程序下多任務(wù)同時(shí)運(yùn)行,具有很高的實(shí)時(shí)響應(yīng)能力。
過(guò)去大多數(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)用移植過(guò)程中,還應(yīng)考慮在Linux系統(tǒng)下解決上層應(yīng)用實(shí)時(shí)響應(yīng)底層硬件中斷,應(yīng)用層與內(nèi)核層的異步通信、數(shù)據(jù)交換,以及多進(jìn)程、多線程的設(shè)計(jì)等問(wèn)題。
2 RTOS到Linux的移植實(shí)現(xiàn)
2.1 地址映射
多數(shù)RTOS是針對(duì)較早的無(wú)MMU的CPU而設(shè)計(jì),所以忽略了內(nèi)存管理部分,即使當(dāng)MMU問(wèn)世后也是這樣——不區(qū)分物理地址和虛擬地址。大多數(shù) RTOS還全部運(yùn)行在特權(quán)模式,雖然表面上看來(lái)是增強(qiáng)了性能,但全部的RTOS應(yīng)用和系統(tǒng)代碼都能夠訪問(wèn)整個(gè)地址空間、內(nèi)存映射過(guò)的設(shè)備以及其他I/O操作。這樣,即使存在差別,也很難把RTOS應(yīng)用程序代碼同驅(qū)動(dòng)程序代碼區(qū)分開來(lái)。
對(duì)于當(dāng)前包含MMU的處理器而言,Linux系統(tǒng)提供了復(fù)雜的存儲(chǔ)管理系統(tǒng),使得進(jìn)程所能訪問(wèn)的虛擬內(nèi)存達(dá)到4 GB。
在Linux系統(tǒng)中,進(jìn)程的4 GB虛擬內(nèi)存空間[1]被分為兩個(gè)部分——用戶空間與內(nèi)核空間。用戶地址空間一般分布為0~3 GB,剩下的3~4 GB為內(nèi)核空間。上層應(yīng)用程序通常情況下只能訪問(wèn)用戶空間的虛擬地址,不能訪問(wèn)內(nèi)核空間的虛擬地址。應(yīng)用程序只有通過(guò)系統(tǒng)調(diào)用(代表應(yīng)用程序進(jìn)程在內(nèi)核態(tài)執(zhí)行)等方式才可以訪問(wèn)到內(nèi)核空間。
而外設(shè)I/O資源是不在Linux內(nèi)核虛擬地址空間中的(如SRAM或硬件接口寄存器等),若需要訪問(wèn)某外設(shè)I/O資源,必須先將其物理地址映射到內(nèi)核虛擬地址空間中,然后才能在內(nèi)核空間中訪問(wèn)它。
Linux內(nèi)核訪問(wèn)外設(shè)I/O資源的方式有兩種:靜態(tài)映射(map_desc)和動(dòng)態(tài)映射(ioremap)。對(duì)于靜態(tài)映射,內(nèi)核在系統(tǒng)啟動(dòng)時(shí)通過(guò)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ū)動(dòng)中訪問(wèn)該I/O資源時(shí)則無(wú)需再進(jìn)行ioremap映射,可以直接通過(guò)映射后的I/O虛擬地址去訪問(wèn)它。
這里主要討論更常用的動(dòng)態(tài)映射方式。動(dòng)態(tài)映射方式是直接通過(guò)內(nèi)核提供的ioremap函數(shù)動(dòng)態(tài)創(chuàng)建一段外設(shè)I/O內(nèi)存資源到內(nèi)核虛擬地址的映射表,從而可以在內(nèi)核空間中訪問(wèn)這段I/O資源。代碼如下:
#define bcon*(volatile unsigned long*)ioremap(0x56000010,4)//動(dòng)態(tài)映射
上述代碼的含義是將0x56000010開始的4字節(jié)的物理地址映射到內(nèi)核的虛擬地址中,返回的起始虛擬地址值賦給bcon宏定義。對(duì)宏定義的操作即對(duì)物理地址的操作。
ioremap宏定義在asm/io.h內(nèi):
#define ioremap(addr, size)__ioremap(addr, size, 0)
__ioremap函數(shù)原型為(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空間和權(quán)限有關(guān)的標(biāo)志。
該函數(shù)返回映射后的內(nèi)核虛擬地址(3G~4G),接著便可以通過(guò)讀寫該返回的內(nèi)核虛擬地址去訪問(wèn)這段I/O內(nèi)存資源。所以,在移植的開始就應(yīng)該在頭文件中完成設(shè)備物理地址的映射,方便后續(xù)的開發(fā)。
在過(guò)去幾年中,Linux成功地取代了一些最主要的傳統(tǒng)RTOS(實(shí)時(shí)操作系統(tǒng))平臺(tái),成為了各種各樣的嵌入式設(shè)備和應(yīng)用中首選的嵌入式操作系統(tǒng)。盡管一度曾被認(rèn)為是不重要的平臺(tái),但今天嵌入式Linux已經(jīng)成為主流,廣泛應(yīng)用于消費(fèi)電子、手持和無(wú)線設(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ù)字移動(dòng)電話業(yè)取得跨越式發(fā)展。
筆者在從臺(tái)式頻譜儀到手持式頻譜儀的項(xiàng)目研發(fā)中實(shí)現(xiàn)了RTOS到Linux的應(yīng)用移植。本文介紹了整體的設(shè)計(jì)思路和一些關(guān)鍵問(wèn)題的實(shí)現(xiàn)細(xì)節(jié)。
1 RTOS到Linux的移植分析
幾乎所有的RTOS都有一個(gè)簡(jiǎn)單的編程模型,它由多線程的執(zhí)行(通常稱為任務(wù))構(gòu)成,包含在單一的地址空間中。在RTOS中,單一主程序下多任務(wù)同時(shí)運(yùn)行,具有很高的實(shí)時(shí)響應(yīng)能力。
過(guò)去大多數(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)用移植過(guò)程中,還應(yīng)考慮在Linux系統(tǒng)下解決上層應(yīng)用實(shí)時(shí)響應(yīng)底層硬件中斷,應(yīng)用層與內(nèi)核層的異步通信、數(shù)據(jù)交換,以及多進(jìn)程、多線程的設(shè)計(jì)等問(wèn)題。
2 RTOS到Linux的移植實(shí)現(xiàn)
2.1 地址映射
多數(shù)RTOS是針對(duì)較早的無(wú)MMU的CPU而設(shè)計(jì),所以忽略了內(nèi)存管理部分,即使當(dāng)MMU問(wèn)世后也是這樣——不區(qū)分物理地址和虛擬地址。大多數(shù) RTOS還全部運(yùn)行在特權(quán)模式,雖然表面上看來(lái)是增強(qiáng)了性能,但全部的RTOS應(yīng)用和系統(tǒng)代碼都能夠訪問(wèn)整個(gè)地址空間、內(nèi)存映射過(guò)的設(shè)備以及其他I/O操作。這樣,即使存在差別,也很難把RTOS應(yīng)用程序代碼同驅(qū)動(dòng)程序代碼區(qū)分開來(lái)。
對(duì)于當(dāng)前包含MMU的處理器而言,Linux系統(tǒng)提供了復(fù)雜的存儲(chǔ)管理系統(tǒng),使得進(jìn)程所能訪問(wèn)的虛擬內(nèi)存達(dá)到4 GB。
在Linux系統(tǒng)中,進(jìn)程的4 GB虛擬內(nèi)存空間[1]被分為兩個(gè)部分——用戶空間與內(nèi)核空間。用戶地址空間一般分布為0~3 GB,剩下的3~4 GB為內(nèi)核空間。上層應(yīng)用程序通常情況下只能訪問(wèn)用戶空間的虛擬地址,不能訪問(wèn)內(nèi)核空間的虛擬地址。應(yīng)用程序只有通過(guò)系統(tǒng)調(diào)用(代表應(yīng)用程序進(jìn)程在內(nèi)核態(tài)執(zhí)行)等方式才可以訪問(wèn)到內(nèi)核空間。
而外設(shè)I/O資源是不在Linux內(nèi)核虛擬地址空間中的(如SRAM或硬件接口寄存器等),若需要訪問(wèn)某外設(shè)I/O資源,必須先將其物理地址映射到內(nèi)核虛擬地址空間中,然后才能在內(nèi)核空間中訪問(wèn)它。
Linux內(nèi)核訪問(wèn)外設(shè)I/O資源的方式有兩種:靜態(tài)映射(map_desc)和動(dòng)態(tài)映射(ioremap)。對(duì)于靜態(tài)映射,內(nèi)核在系統(tǒng)啟動(dòng)時(shí)通過(guò)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ū)動(dòng)中訪問(wèn)該I/O資源時(shí)則無(wú)需再進(jìn)行ioremap映射,可以直接通過(guò)映射后的I/O虛擬地址去訪問(wèn)它。
這里主要討論更常用的動(dòng)態(tài)映射方式。動(dòng)態(tài)映射方式是直接通過(guò)內(nèi)核提供的ioremap函數(shù)動(dòng)態(tài)創(chuàng)建一段外設(shè)I/O內(nèi)存資源到內(nèi)核虛擬地址的映射表,從而可以在內(nèi)核空間中訪問(wèn)這段I/O資源。代碼如下:
#define bcon*(volatile unsigned long*)ioremap(0x56000010,4)//動(dòng)態(tài)映射
上述代碼的含義是將0x56000010開始的4字節(jié)的物理地址映射到內(nèi)核的虛擬地址中,返回的起始虛擬地址值賦給bcon宏定義。對(duì)宏定義的操作即對(duì)物理地址的操作。
ioremap宏定義在asm/io.h內(nèi):
#define ioremap(addr, size)__ioremap(addr, size, 0)
__ioremap函數(shù)原型為(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空間和權(quán)限有關(guān)的標(biāo)志。
該函數(shù)返回映射后的內(nèi)核虛擬地址(3G~4G),接著便可以通過(guò)讀寫該返回的內(nèi)核虛擬地址去訪問(wèn)這段I/O內(nèi)存資源。所以,在移植的開始就應(yīng)該在頭文件中完成設(shè)備物理地址的映射,方便后續(xù)的開發(fā)。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- Linux系統(tǒng)移植技術(shù)入門 0次下載
- STM32移植UCOS RTOS的步驟方法 8次下載
- 基于TI AM5728 RTOS開發(fā)手冊(cè)
- [深度理解嵌入式linux系統(tǒng)移植]深度理解嵌入式linux系統(tǒng)移植
- 【Linux】嵌入式Linux系統(tǒng)的移植(上篇:交叉編譯器、連接方式)
- ATWILC器件Linux移植指南 8次下載
- 長(zhǎng)文詳解嵌入式Linux系統(tǒng)移植資料下載
- 如何在DM6446 GPIO中進(jìn)行LINUX的驅(qū)動(dòng)移植詳細(xì)程序說(shuō)明
- 如何吧Mysql數(shù)據(jù)庫(kù)移植到嵌入式Linux的詳細(xì)資料說(shuō)明 4次下載
- 如何吧SQLite移植到嵌入式Linux系統(tǒng)的詳細(xì)資料說(shuō)明 8次下載
- 如何吧tcpdump網(wǎng)絡(luò)抓包工具移植到嵌入式linux系統(tǒng) 6次下載
- 如何將SQLite移植到linux的方法程序說(shuō)明概述 0次下載
- 將設(shè)計(jì)從MCP201移植到MCP2021A免費(fèi)下載
- Linux ARM移植教程
- Linux-2.6.25移植
- 【從0開始創(chuàng)建AWTK應(yīng)用程序】編譯應(yīng)用到RTOS平臺(tái) 438次閱讀
- ELF 1技術(shù)貼|如何將Python3.6.9移植到開發(fā)板上 311次閱讀
- 【AWTK開源智能串口屏方案】HMI端程序移植編譯及運(yùn)行 669次閱讀
- gdb本地調(diào)試版本移植至ARM-Linux系統(tǒng) 482次閱讀
- RTOS核心:調(diào)度和分割 637次閱讀
- 詳解選擇RTOS的要點(diǎn) 755次閱讀
- 如何將ThreadX移植到STM32平臺(tái) 1492次閱讀
- 實(shí)操經(jīng)驗(yàn)分享——在STM32上移植Linux 1.2w次閱讀
- 從RTOS到嵌入式Linux的應(yīng)用移植步驟以及相關(guān)的關(guān)鍵技術(shù)分析 3186次閱讀
- 如何在晶心平臺(tái)上建立Linux基礎(chǔ)架構(gòu)? 792次閱讀
- Linux內(nèi)核的DL調(diào)度器的細(xì)節(jié)和怎么樣使用DL調(diào)度器? 5351次閱讀
- 為什么選擇Linux操作系統(tǒng)?制約標(biāo)準(zhǔn)Linux操作系統(tǒng)實(shí)時(shí)性的因素 5364次閱讀
- 如何將Linux2.4移植到ARM平臺(tái)的嵌入式系統(tǒng) 3659次閱讀
- 利用6 個(gè) Linux 運(yùn)維典型問(wèn)題來(lái)分析處理問(wèn)題的思路 2851次閱讀
- PowerPC平臺(tái)Linux的移植(二) 1194次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多