本文原作者寫于5年前,期間可能有些技術的小變化,但作為對嵌入式Linux和QNX的入門了解還是不錯的。
介紹
上個世紀90年代末期,Web設備被吹捧為下一個劃時代的“大事件”,一種新型設備會產生一個新興市場從而會產生下一代消費IT巨頭。在拉斯維加斯的消費電子展上和QNX 2000國際技術會議上,大大小小的生產商展示了許多對未來的構想。
英特爾基于Linux構建了Web設備,微軟的合作方基于一個閹割版的Windows CE開發Web設備。其他公司,比如3Com和Netpliance iOpener則是基于QNX。當時Web設備看起來很大可能是消費電子的未來。相比個人電腦,他們提供更少的功能。那個時候, Ken Kalinoski(Netpliance的發展副總裁)能想到的最好的方式是一個富客戶端連接到一個專門的服務器上。百思買和沃爾瑪貨架上后面Web設備的減少說明消費者并不買賬。他們不想要一個設備只能瀏覽網頁和處理簡單的郵件,但是不能處理文本或存儲數據。并且,消費者也不喜歡被指定的服務供應商綁定。
Linux和QNX因為作為Web設備上的操作系統和巨大的平臺開發能力聲名鵲起。Linux過去作為服務器操作系統使用最多,而QNX主要用于工業級的嵌入式實時操作系統。為了挖掘新的市場,許多開發者開始開發Linux和QNX在更小,更便攜式設備上的能力。
事后看來,Web設備是一個技術超前的想法。即使有軟件和工程天才們生產這些設備,但是硬件和基礎設施的局限性不能讓Web設備滿足一個電子必需品的功能,比如多功能性和便攜性。移動電話和PDA技術的提高,數碼攝像機的進步,更低電量的需求,內存的增長,嵌入式或移動CPU速度的巨大提升,以及802.11b和802.11g WIFI無線網絡協議,這些所有的因素促使Web設備成為一個多功能設備。這個設備集合了電腦,辦公軟件,手機,攝像機(包括電影),傳呼機,音樂播放器,當然也包括Web 瀏覽和郵件系統。這些所有的功能集成在一個可以放進口袋的無線設備上。
四年之后,我們處在一個新的“下一個大事件”的邊緣。在已經具有龐大的PDA和Internet功能的手機市場上,硬件以及就地無線和服務基礎設施的進步,對能夠提供更多功能,更緊湊且電池壽命更長的設備產生了巨大的需求。這個重新激發了人們對嵌入式開發平臺的興趣,保證將來能在數十億美元的市場中競爭。
設計相似之處就在這里結束。Linus Torvalds 使用宏內核架構設計了Linux作為一個通用的操作系統運行在個人電腦上。內核幾乎包含了操作系統需要的所有功能。相反,QNX的設計則更加模塊化和可擴展。QNX是一個基于微內核的實時操作系統,能足夠小的嵌入到芯片提供運行工作站或大型網絡服務器的能力。
Linux的嵌入式發展
由于Linux自身的健壯性,相對緊湊,通用,低成本和開源的license模式這些優點,嵌入式系統的設計者很長時間都在使用Linux。Linux可以讓設計軟件充分利用大量的開發人員,永遠豐富的代碼遺產和行業標準的便攜式操作系統接口(POSIX)API。
標準的Linux內核沒有嵌入式系統要求的實時能力(可預測的應答時間和毫秒級的延遲通常被認為是確定的事件)例如電傳操縱,ABS制動系統,連續介質和醫療設備。但是,Linux可以直接用于不受確定性問題影響的消費類設備中。為了滿足當前正在開發的嵌入式設備的需求,出現了幾種Linux產品,可以滿足更加可預測的速度和定時行為。
嵌入式系統中使用Linux
盡管一開始Linux設計是為了個人電腦使用,但是Linux也可以成為一個可靠的嵌入式操作系統。一個具有所有功能的Linux內核的縮小的Linux包,僅占用約1M的內存。純的Linux內核(虛擬內存和所有核心操作系統功能)僅占用大約100K。加上網絡棧和基本的使用,一個完整的Linux運行時大約占用500K內存。所需要的總的內存由運行的應用程序來運行,但是Linux系統僅需要256K ROM和512K RAM就可以工作。這對嵌入式市場來說是一個輕量級的操作系統。
使用開源的Linux系統另一個好處是,相比較傳統的實時操作系統,Linux開發社區會更快的支持新的協議以及比實時操作系統供應商支持更多的設備驅動。
Linux操作系統的核心是一個相對簡單的微內核架構。網絡和文件系統以模塊化的方式位于宏內核之上。驅動和其他功能可以編譯進內核,也可以在運行時加載。這提供了一種高度模塊化的構建塊方法來構建定制的嵌入式系統,該方法通常使用定制驅動程序和應用程序的組合來提供附加功能。
為了避免重新發明輪子,嵌入式系統通常需要使用現成的程序和驅動程序構建通用功能。許多程序和驅動程序用于外圍設備和應用程序。Linux可運行在大多數需要有大量外設的微處理器上,并且有大量的現場的應用。
Linux能夠很好的適配嵌入式網絡設備,因為它支持多處理器系統,擁有擴展性。這讓設計者多了一個選項,可以在雙處理器系統上運行一個實時的應用程序,從而提高總的處理能力。所以你可以在一個處理器上運行Linux,而同時在另一個處理器上運行GUI。
在嵌入式系統上運行Linux的一個缺陷是,Linux架構不能以一個標準的形式提供實時能力。比如標準的Linux是根據公平算法來進行任務調度,也就是給每個任務相同的處理器時間。解決方案是通過額外的實時變化修改Linux讓它以確定的方式運行。
第一個解決方案是在內核空間增加額外的軟件模塊。加在操作系統實現調度策略,硬件中斷和程序執行的部分。由于這些實時的軟件模塊運行在內核空間,操作系統由于代碼錯誤崩潰會影響整個操作系統的可靠性。
第二個解決方案,如圖1所示,以雙內核的方式為實時任務提供實時環境。這種方式需要開發者開發新的驅動和系統服務,盡管對等的服務已經在標準的Linux內核中存在了。這種實時操作系統方案會延長加載時間并且增加操作系統占用的空間。
第三種方案是其他Linux生廠商重寫部分代碼來實現實時功能,比如調度來保證行為確定。
圖1:擁有雙標準和實時操作系統內核的Linux
嵌入式Linux的標準化
Linux有超過200多個的發行版本和很多嵌入式版本。由于嵌入式Linux要沒有存在的標準,一個統一的平臺規范讓Linux的使用具有一個更經濟,專注的環境,Linux幾乎就是無用的。
為了保證嵌入式Linux版本的兼容性,嵌入式Linux聯盟(ELC)成立了。ELC是一個非盈利性行業協會,致力于在整個嵌入式計算市場中改進,促進和標準化Linux。成員們為了享受標準化帶來的好處,要參與管理、促進,實現和平臺規范工作組。
ELC的使命是:“…..讓Linux成為嵌入式系統開發者的首選“。Inder Singh博士,ELC的主席和Lynuxworks的CEO評價說:“Linux已經開算成長為消費類電子產品的操作系統的主要選擇之一,越來越多的嵌入式軟件使用Linux”。
Karen Chupka,消費電子協會活動和會議副總裁表明,“操作系統軟件是消費類電子產品快速增長列表中一個關鍵的考慮點,Linux有望在2004年增長……”
現在超過75家公司加入了由索尼和松下成立的消費電子Linux論壇,來促進基于Linux的數字消費電子產品。2003年6月,一些其他的消費電子產品公司也加入了該論壇。這些公司是EC, Hitachi, Royal Philips, Samsung, Sharp and Toshiba.
三個嵌入式Linux 版本
松下消費電子版本3.0
松下為它的消費電子設備引入了嵌入式Linux。松下“消費電子版本3.0”(CEE)是嵌入式操作系統。它的目標是手機,數字電視,機頂盒和汽車遠程信息處理的應用程序。CEE設計用于高度受限的移動設備,這些設備的特點是低功耗,內存大小受限以及啟動和恢復時間端。據稱它是第一個專門為消費電子市場設計的商業嵌入式Linux發行版。
CEE支持動態電量管理功能,文件系統加強和測量性能,系統時間,內存大小的工具,文件支持流媒體優化。
CEE的功能包括:
免稅版的嵌入式Linux OS和開發環境
消費級別的可靠性
搶占式內核技術和實時調度
動態電源管理優化了電量使用,延長了電池壽命
內核快速啟動時間
文件系統加強,包括對流媒體支持的優化
eXecute In Place(XIP)提供快速啟動,待機和恢復功能
可擴展的內存占用空間可容納各種消費類產品
“金標準”網絡可實現高性能的互聯應用
圖形化的MontaVista系統測量工具可促進消費者級的性能調整
預集成Java*和圖形開發以及運行時產品,可選
支持各種商業和開源應用程序和中間件
LynxOS
嵌入式軟件公司LynuxWorks構建了兩個嵌入式Linux版本。如圖2所示,LynxOS是一個硬實時嵌入式系統。LynxOS是一個Linux實時操作系統,前融Linus ABI和POSIX。由于是微內核設計,內核占用非常小,僅有28KB大小。
圖2
小型內核提供包括調度,終端分配和同步等必要的服務。其他服務由內核輕量級服務模塊提供。這些模塊被稱為內核插件(Kernel Plug-Ins, KPIs)。新的KPIs可以被加到內核中用來支持I/O, 文件系統,TCP/IP,流和Socket。KPIs是多線程的,意味著每個KPI可以根據要求創建多個線程。
向KPI發送消息時沒有上下文切換。比如當給文件系統KPI發送服務請求消息(RFS)時,不需要上下文切換從而減少運行時的開銷。KPI之間的通信只依靠很少的指令,因而開銷很低。
應用程序通過系統調用向I/O系統發出I/O請求。內核將I/O請求定向到設備驅動程序。每個設備驅動程序都有一個中斷處理程序和內核線程。中斷處理程序執行中斷處理的第一步。如果未完成處理,則會設置為內核異步陷阱。稍后,當內核可以響應軟件中斷時,它會調度內核線程的實例完成中斷處理。
藍貓
藍貓是LynuxWorks公司構建的第一個Linux版本。藍貓不是一個實時操作系統,但是與LynxOS二進制兼容,因此嵌入式應用程序可以輕松地移植到RTOS。藍貓主要是為了對實時性沒要求的嵌入式系統。
QNX
QNX是一個基于POSIX為嵌入式系統特別設計的實時操作系統。它不僅能夠讓Linux開發者保持他們的編程習慣,而且還保留了Linux開源模型的關鍵特性。帶來的好處是,這種方式能夠讓嵌入式開發者無論是在標準的Linux還是實時的擴展Linux都可以享受OS的服務。圖3說明了QNX的架構。
圖3:QNX架構
QNX是QNX Software Systems Ltd. (www.qnx.com*), Kanata, Ont.公司的商用產品。和Linux一樣,QNX也是基于1970由貝爾實驗室開發的UNIX。QNX和Linux都遵循LINUX POSIX標準。
QNX Neutrino微內核為實時和非實時的應用提供了一個統一的環境。QNX基于實時,微內核的架構(見圖3)提供POSIX兼容的API。Neutrino微內核只包含最基礎的操作系統服務。所有其他的服務都可以通過可選的,內存保護的進程來提供,可以動態的啟動和停止。為了實現模塊化,QNX Neutrino使用消息傳遞作為整個系統IPC最基本的方式。
和Linux不同,QNX沒有把POSIX作為附加層來實現。QNX微內核從一開始設計時就支持POSIX實時性,包括線程。ELC規范是基于現存的POSIX 1003.1標準。這個標準QNX也支持。因此,QNX能夠天然支持嵌入式Linux應用。
QNX,和Linux一樣,提供開源模式的好處。通過代碼,開發者能夠分析操作系統的架構以便更好地集成他們的代碼,適配操作系統組件來滿足應用特定的需求,并節省問題定位的思考時間。QNX通過兩種方式來提供上面的好處。
通過使用高度擴展的微內核架構
給客戶提供驅動,庫和BSP(Board support package)的源碼,包括為各種標準設備提供驅動開發套件
作為微內核操作系統,QNX Neutrino從根本上對定制開發。這是因為大部分操作系統層面的服務驅動,文件系統和協議棧存在于內核外的用戶空間,只有少量的核心服務(比如調度,定時器,中斷處理)存在內核中。因此,開發自定義驅動程序和應用程序特定的OS擴展不需要特殊的內核調試器或內核專家。事實上,作為用戶空間的程序,開發OS擴展和開發標準的應用程序一樣簡單,因為它們可以用大家熟識的標準的源碼級別的工具調試。
QNX Neutrino允許應用程序通過稱之為同步消息傳遞這種統一的IPC方式來訪問所有的驅動程序和操作系統服務。這種方式有幾個好處。比如,由于QNX的消息傳遞是同步的,從而能夠自動協調通信程序的執行,因此無需在每個進程中手動編碼和調試復雜的同步服務(見圖3)。消息傳遞本質上簡化了復雜操作系統,將其劃分為明確定義的可以單獨開發,測試和維護的基礎構建模塊。通過任何提供服務的程序在路徑名空間注冊路徑名將其廣而告之給其他程序來實現。任何程序都能夠通過在路徑名上調用比如open(), read(), write(), 或者lseek()來訪問其他服務。
舉個例子。QNX串口驅動通常注冊路徑名/dev/ser1表示第一個串口。任何想訪問這個端口的應用程序可以通過調用在/dev/se1上的open()函數來實現。對于應用程序而言,open()函數和標準的POSIX接口一樣。
Neutrino C函數庫將這個調用轉成io_open消息并把這個消息轉發給串口驅動。如果應用程序接下來要想串口寫一個字符,調用序列如下:客戶端調用write()函數,C函數庫會構建一個io_write消息。這個消息會被轉發給驅動。
這樣帶來的另一個好處是只要該服務支持某特定的功能,確切的消息就可以從任何客戶端發送給任何服務。比如,向一個串口或磁盤文件寫一個字符串,應用程序在這兩種情況可以調用相同的write()函數,唯一的區別是消息要發送的地方。這意味著應用程序和它依賴的服務是解耦的。這種解耦可以使開發簡單化,因為應用程序和系統服務之間所有的交互可以用一個簡單的基于POSIX的編程模型來實現。
這樣簡化了代碼移植到其他平臺因為應用程序不包含任何硬件或協議特定的代碼。
通過給客戶提供比如庫,驅動和BSP的源碼,QNX Neutrino進一步簡化了問題定位和OS的定制化開發。開發者可以免費下載設備驅動包(Device Drive Kits, DDKs)。DDKs包含文檔和一個軟件框架。這個軟件框架實現了庫中更高級別的獨立設備的代碼。
在涵蓋大多數Linux源代碼的GPL中未提供QNX源代碼。然而,QNX軟件系統基于它們自己的License協議提供源碼。不像GPL,可以讓開發人員自由創作衍生作品,而不必放棄知識產權(IP)。
作為宏操作系統,Linux將大部分的驅動,文件系統和協議中都綁進了內核中。因此這些模塊中任何一個單一的編程錯誤就有可能導致致命的內核錯誤。在QNX Neutrino中,這些模塊都運行在獨立的、內存保護的地址空間中,內核崩潰很難發生。因此QNX Neutrino為實時應用程序提供了一個比Linux更健壯的環境。并且也肯定比雙內核方法中使用的不受保護的實時內核強得多。
QNX附加值:
QNX Neutrino提供了QNX微網絡服務,允許消息在處理器邊界之間透明地流動。這意味著任何進程都可以訪問任何資源任何網絡節點就好像它們在本地一樣。如果驅動的路徑名在本地,QNX微內核可以直接路由這個消息。如果這個驅動在遠程節點上,QNX微網絡會透明的將這個消息轉發給對應節點。
網絡流量可以在所有可用鏈路上實現負載均衡,從而提高吞吐量。該服務是內置的,應用程序不需要任何特殊的網絡代碼。
QNX微內核體系結構的細粒度可擴展性使得運行時環境比Linux小得多。
Photon microGUI也使用微內核的架構。因此,設計人員可以輕松地“拔出”內存受限設備不需要的GUI服務。
QNX支持TCP/IP, NFS和Linux文件系統。因此使用QNX和Linux混合工作站的開發商店可以在這兩種環境中分享資源。簡而言之,Linux和QNX Neutrino不僅可以共存,還可以做更多的事情。相反,跟其他實時或通用的操作系統相比,它們為開發人員提供了更廣泛的在應用程序中使用相同的API,源代碼和技能點的機會。
QNX 支持 MIPS, PowerPC, SH4, StrongArm, xScale, and x86硬件架構。它可以從受約束的嵌入式平臺擴展到多處理器平臺。該體系結構提供多任務處理,優先級驅動的搶先式調度,同步和TCP/IP協議。同時還提供了包括PPP,DHCP,NFS,RPC和SNMP的實用程序。
QNX具有稱為Qnet的基于消息的本機網絡。
Photon microGUI桌面系統是一個內存占用很小的GUI。
對于GUI應用程序,QNX有一個叫Photon Application Builder(PhAB)的集成開發環境。不像Visual Basic,它沒有拖拽控制。
自我托管功能簡化了開發
QNX使用GNU GCC編譯器
QNX RTP支持GCC-2.95 C和C++。而且QCC作為一個GCC前端的抽象層屏蔽了不同編譯器(GNU GCC, Watcom和Metrowerks)之間的差異。還有一個CC端用來屏蔽可用編譯器之間的差異。該前端還可以基于文件擴展名調用對應的編譯器(C或C ++)。目前它調用GCC/G++。對于項目代碼管理,QNX的發行版本中包含了make, CVS和RCS這些工具。
支持GCC編譯器的交叉編譯版本,允許開發者在Windows平臺上開發Neutrino應用程序。
結論
在QNX中,實時和非實時環境是一樣的。實時應用程序可以充分使用POSIX API和訪問系統服務。POSIX/Linux應用程序可以立刻獲得確定的行為。由于實時和非實時應用程序運行在相同的基于消息的環境中,進程之間的通信就非常簡單了。減少重復工作。像之前討論的,雙內核方式會逼迫開發者使用不熟悉的API開發定制驅動。在大部分的操作系統環境中,開發這些驅動要求內核調試工具(非常難用),內核重新編譯(非常耗時)和內核編程(成本高)。QNX Neutrino通過幾種方式解決了這個問題。首先,像任何已具有大量用戶群的OS一樣,QNX支持各種用于標準硬件的現成驅動程序。并且,就像我們看到的,QNX在用戶空間運行驅動,因此可以使用標準的代碼級別的工具和技術。QNX DDKs讓開發變得更簡單了。DDK提供文檔,庫文件,頭文件和可定制的各種驅動程序源。除了微內核的功能,由于微內核實時操作系統的設計是為了滿足嵌入式系統的要求,QNX Neutrino還為Linux開發人員提供標準Linux或實時Linux擴展均不具備的功能。
與QNX相比,Linux有更大的開發人員社區,軟件社區和真正的開源代碼,以及更大的平臺社區。ELC和CELF正在使嵌入式Linux標準化。嵌入式Linux的最新版本要求具有完全POSIX兼容性的硬RTOS。
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5087文章
19158瀏覽量
306450 -
Web
+關注
關注
2文章
1266瀏覽量
69571 -
Linux
+關注
關注
87文章
11329瀏覽量
209967 -
操作系統
+關注
關注
37文章
6862瀏覽量
123502 -
qnx
+關注
關注
0文章
75瀏覽量
26205
原文標題:QNX和Linux嵌入式發展史
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論