歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> 剖析Linux 2.6內核在嵌入式上的應用

剖析Linux 2.6內核在嵌入式上的應用

日期:2017/2/27 11:52:57   编辑:Linux文化

眾所周知,Linux在嵌入式系統中的應用已經非常普遍。為了進一步促進這方面的應用,在Linux 2.6中,引入了很多非常有利於嵌入式應用的功能。這些新功能包括實時性能的增強、更方便的移植性、對大容量內存的支持、支持微控制器和I/O系統的改進等。

嵌入式計算通常涉及到各種尺寸的計算機,其中包括從小型手持設備(比如手表、照相機)到包含成千上萬個節點的分布式系統(比如通信交換機)。嵌入式系統可能簡單得只需要一個小的微控制器,也可能使用的是大量的並行處理器和海量的內存。Linux 2.6的改進,則對這一系列需求提供了支持。

響應時間的改進

嵌入式系統通常需要穩定的時間限制。雖然Linux 2.6還不是一個真正的實時操作系統,但說到其改進後的響應能力更加適合於這一領域的需求。

在2.6內核以前,要想讓Linux獲得更好的響應能力,就需要一些特殊的補丁。通常情況下,需要用戶從廠商處購買補丁來改進中斷性能和調度反應時間。如今,2.6內核把這些改進加入到了主流的內核當中,因此無需再對其進行特殊的配置。

Linux 2.6提供了一些功能,可以改進整體響應能力。其中兩個改變更值得注意,首先現在使用的是搶占式內核,其次使用的調度算法也更加高效。

搶占式內核

和其它大多數通用操作系統一樣,當一個進程被系統調用並處於運行狀態時,以前版本的Linux是不允許進程進行調度的。這就意味著一旦系統調用中有某個任務正在執行,那麼該任務就會控制處理器,直到系統調用結束,而不管其使用處理器時間的長短。這種設計顯然要簡單得多,但是在很多時候這會導致一些更重要的任務在等待系統調用完成的過程中被耽擱。

現在,內核在一定程度上使用了可搶占的模式。因此,在一些時效性比較強的事件中,Linux 2.6要比2.4具有更好的響應能力。當然了,它實際上並不是一個真正的RTOS,但是與以前的內核相比較,“停頓”的感覺要少得多。在Linux 2.6內核中,代碼被設置了搶占點,這就意味著調度程序會中止現在正在運行的進程而來執行優先級更高的進程。在系統調用過程中,Linux 2.6會定時地檢查搶占點,以避免不合理的延遲發生。而在檢查過程中,調度進程很可能就會中止當前的進程來讓另外一個進程運行。

有執行時間限制的軟件和虛擬內存請求頁面調度是不兼容的,因為這種方法處理頁面慢的缺點會破壞程序的響應能力。而2.6內核可以被編譯成沒有虛擬內存的系統來消除這個問題。當然,這就要求軟件設計人員必須考慮要有足夠的實內存來運行應用程序。

圖1和圖2顯示了2.4.1內核和2.6內核在平均情況下和最壞情況下任務的響應時間。數據來自通過一台PⅢ 1.0GHz處理器采集的310萬個樣本。測試使用的是帶有超過5個中斷的LynuxWorks的實時測試設備。系統處在由持續地磁盤數據傳送、網絡通信、控制台輸入、圖像處理和一個定時卡組成的高負載下運行。

圖1 平均響應時間

圖2 最差響應時間

高效的調度程序

在2.6版本中,進程調度經過重新編寫,去掉了以前版本中效率不高的算法。以前,為了決定下一步要運行哪一個任務,進程調度程序要查看每一個准備好的任務,並且經過計算來決定哪一個任務相對來說更為重要。所有的計算完成之後,得分最高的任務將被選中。因為這種算法中大量的任務需要的時間一般都不相同,一些復雜的多任務應用程序往往得不到及時的調度。

在2.6內核中,調度程序每次不再掃描所有的任務,而是在一個任務變成就緒狀態時將其放到一個名為“當前隊列”的隊列之中。當進程調度程序運行時,它只選擇隊列中最有利的任務來執行。這樣,調度就可以在一個恆定的時間裡完成。當任務執行時,它就會得到一個時間段,或在其轉到另外一個線程之前得到一段時間的處理器使用權。當它的時間段用完之後,任務就會被移到另外一個名為“過期”的隊列中。而在該隊列中,任務會根據其優先級進行排序。

從某種意義上講,所有位於當前隊列的任務都將被執行並且都將被移到“過期”隊列之中。當這種事情發生時,情況就會有所變化,隊列就會被進行切換,原來的“過期”隊列成為當前隊列,而空的當前隊列也就變成了過期隊列。由於在新的當前隊列中的任務已經被排列好了,調度程序現在也可以使用簡單的隊列算法,即總是取當前隊列的第一個任務進行執行。不管任務是多是少,這個新的過程實際上要比老的過程快得多。

新的同步措施

多進程應用程序有時需要共享一些資源,比如共享內存或設備。為了避免競爭的出現,程序員會使用一個名為互斥的功能來確保同一時刻只有一個任務在使用資源。到目前為止,Linux還是通過一個包含在內核中的系統調用來完成互斥的實現,並由該系統調用來決定一個線程是等待還是繼續執行。但當決定繼續執行時,這個耗時的系統調用就不需要了。Linux 2.6內核支持所謂的FUSM(Fast User-Space Mutex)。這個新功能會檢查用戶的空間,查看是否會有等待的情況出現,並且只有在線程需要等待時才進行系統調用。而當等待不需要時,就會避免不必要的系統調用以節約時間。該功能也使用優先級調度,以便在出現競爭時決定哪一個線程可以被執行。

共享內存的改進

嵌入式系統有時也是一個有很多處理器的設備,比如在電信網絡或大型存儲系統中就是如此。而不論是均衡或是松散連接的多處理器,一般都是共享內存的。均衡多進程的設計是所有的處理器都有對內存有均等使用權,而限制使用內存的決定性因素是進程的效率。Linux 2.6為多程序提供了一種不同的途徑,即所謂的NUMA(Non Uniform Memory Access)。這種方法中,內存和處理器是相互連接的,但是對於每一個處理器,一些內存是“關閉”的,而有的內存則是“更遠”的。這就意味著當內存競爭出現時,“更近”的處理器對就近的內存有更高的使用權。2.6內核提供了一套功能來定義內存和處理器之間的拓撲關系。調度程序可以利用這些信息來為任務分配本地內存。這減少了內存競爭造成的瓶頸,因而提高了吞吐量。

POSIX線程、信號和計時器

POSIX標准描述的是一套用於創建和管理POSIX線程的功能。這些經過精心定義的系統功能在以前的Linux版本中就可以用了,不過在2.6內核中,它得到了很大的改進。相比較而言,NPTL(Native POSIX Thread Library)的改進更為明顯,甚至都已經超過了現在一些補丁中可用的高性能選擇方案。

與POSIX線程一起,2.6把POSIX信號和POSIX高精度計時器作為了主流內核的一個組成部分。POSIX信號比以前Linux版本中使用的Unix模式的信號有了很大的改進。新的POSIX信號不能被丟失,並且可以攜帶信息作為參數。此外,POSIX信號也可以從一個POSIX線程傳送至另外一個線程,而不是像Unix信號一樣,只能從一個進程至另外一個進程。

嵌入式系統通常要求硬件能夠在固定的時間安排下來運行任務。POSIX計時器可以輕松地讓任何一個任務都可以周期性地得到預定安排的時間。計時器的時鐘可以達到很高的精度,從而可以讓軟件工程師更加精確地控制任務的調度。

支持通用設計

嵌入式世界裡的硬件設計通常都要經過定制,以滿足特定的應用程序。因此,設計人員經常需要使用原始的方式來解決設計上的問題。比如,為特定目的制造的主板可能使用不同的IRQ管理器而不是使用類似的設計。為了能在一塊新的主板上運行,Linux就要進行更改(遷移)以支持新的硬件。如果操作系統是由獨立的組件組成的,那麼這種更改應該說是比較簡單的,因為只需要更改那些需要更改的代碼。在2.6內核中,就引入了一個名為子框架的概念。在新的定義中,各組件被清晰地分開,並且可以獨立進行更改或替換,而不會對其它的組件或軟件包造成影響,或者影響非常小。

設備、總線和I/O

現在Linux正在變成行業用戶的第一選擇。2.6內核包含了ALSA(Advanced Linux Sound Architecture),該體系結構可以安全地使用USB和MIDI設備。通過使用ALSA,系統可以同時播放和記錄音頻。

用於支持視頻的Video4Linux系統,在2.6中也煥然一新。雖然其不能向後兼容,但卻可用於最新的廣播、電視、數碼相機和其它的多媒體。

Linux 2.6使用的是USB 2.0,它要比一般的USB快40倍。可以預見,在不久的將來,高速設備將非常普及,而在對USB 2.0支持方面,Linux可以說是一個先行者。

對64位處理器的支持

在一些嵌入式系統中,計算機要提供非常多的資源,比如很大的內存和高吞吐量的多處理器。這些大型系統有數量眾多的嵌入式應用程序,比如大規模存儲系統和特殊計算引擎。

使用2.6內核,對於那些需要大量內存的嵌入式Linux開發人員就可以選擇64位的處理器。Intel安騰64位處理器在以前的Linux版本中就已經被支持,而在新版本中,更是包含了AMD64體系結構,開始提供對AMD Opteron處理器的支持。當然PowerPC也沒有被忽略,現在PPC64也已經獲得了支持。很顯然,Linux社區對於大容量總線、大容量內存計算的創新問題充滿了激情。

支持微控制器

現在主流的Linux 2.6內核中,也提供了對微處理控制器的支持。以前,大多數情況下Linux都需要一個包含內存管理的全功能微處理器。然而,在嵌入式市場領域,更簡單的微控制器更適於低價和簡單的應用。

Linux的微控制項目成為了一個Linux應用於小型系統中非常重要的分支。這個名為uClinux的分支已經受到了小型處理器開發人員的廣泛關注。2.6版本中把uClinux中一個非常重要的部分整合到了內核之中,使得微控制器被主流的Linux所支持。

2.6內核支持一些沒有內存管理單元的微控制器,比如它支持摩托羅拉m68k的Dragonball和ColdFire、日立的H8/300、NEC v850,以及Axis通信公司的ETRAX網絡微控制器家族。

32位處理器上的大容量內存

有時,嵌入式系統可能需要使用通用的Intel架構處理器,但是卻需要超出一般32位地址空間所能訪問的內存。對此,Intel引入了一個名為PAE(物理地址擴展)的概念,這使得32位的處理器可以訪問達64GB的內存。通過PAE,Linux 2.6運行在更新的x86系統上時,可以通過一個可移動的“窗口”來查看內存。Linux 2.6對PAE的支持使得它尤其適於那些需要快速處理大量數據的應用程序之中。

真正的王者

Linux價格低、功能豐富和開放的特性,使其成為了嵌入式世界裡發展最快的操作系統。可以預見,Linux在嵌入式領域裡將成為真正的王者,而2.6版本的推出,則是Linux王者之路上具有裡程碑意義的時刻。

Copyright © Linux教程網 All Rights Reserved