基於uClinux的NPTL執行緒庫移植

2021-04-14 21:22:58 字數 2710 閱讀 9212

2007-12-25 09:56:29

摘要:在linux2.6中,nptl(native posix thread library)已取代linuxthreads成為glibc的首選執行緒庫,但是在嵌入式作業系統中普遍使用的基於posix 標準的執行緒庫仍是linuxthreads。分析了nptl執行緒庫的記憶體管理機制,基於嵌入式作業系統uclinux無mmu的特性,修改了執行緒棧及uclibe庫,實現了nptl在uclinux上的移植,並在相容性與效率兩方面相對於linuxthreads執行緒庫進行了測試。

0 引言

與程序相比,執行緒是一種非常「節儉」的多工操作方式且執行緒間擁有更加方便的通訊機制 。因此,執行緒的引入對於日趨複雜的作業系統而言意義重大。

目前,在嵌入式作業系統中普遍使用的基於posix標準的執行緒庫是linuxthreads。雖然這種實現機制已經在不少的應用當中表現出了較好的效能,但仍存在一定的問題。nptl(nativeposixthread ubrary) 是redhat公司牽頭研發的新一代執行緒庫,它在一定程度上彌補了linuxthreads的缺點。本文將實現nptl在嵌入式作業系統uclinux上的移植。

1 nptl記憶體管理機制分析

uclinux同標準linux的最大區別就在於記憶體管理。對於uclinux來說,其設計針對沒有mmu的處理器,所以uclinux採用實儲存器管理策略,所有程式中訪問的位址都是實際的實體地址。根據uclinux的特點,nptl的移植工作將主要集中在記憶體管理上。

nptl定義了乙個struct pthread資料結構來描述執行緒。在此資料結構中與記憶體管理相關的幾項屬性有:

struct pthread;

為了節省開銷,nptl採用了以下兩項措施來優化記憶體管理。

(1)合併必要的記憶體塊。執行緒描述資料結構與執行緒區域性儲存都放在堆疊上,可用的堆疊從這兩個結構向下開始(如果是向上的堆疊,則從滿足這兩個結構的記憶體向上開始)。執行緒棧的分配方法隨著體系結構的不同而不同,這裡只分析i386等平台上(包括一般嵌入式平台)所使用的兩種棧組織方式:系統分配方式和使用者自定義方式。

在系統分配方式下,nptl利用mmap()建立一定大小的從物理記憶體空間到程序虛存區間的對映,並使用mprotect()設定其中第一頁為非訪問區,用來監測棧溢位。其執行緒棧空間的功能分配如圖1所示。

2 基於uclinux的移植

2.1 執行緒棧的分配

基於無mmu特性,uclinux重新定義封裝了原有的記憶體分配函式。mmap()系統呼叫最終由核心函式kmalloc()實現,分配一塊物理記憶體區,返回的是該物理記憶體區的起始位址。uclibc中所定義的malloco函式不再以系統呼叫brk()實現,而是以設定好特定引數的mmap()實現。因此,在將ntpl移植到uclibc中時,可直接呼叫malloc()函式分配指定大小的執行緒棧,相應地,用free()函式進行記憶體的釋放。由於uclinux對記憶體空間沒有保護,因此在呼叫malloc分配了執行緒棧空間後,並不呼叫mproteet()設定保護區。這樣,程式的正確性就不得不由開發人員來保證。根據嵌入式作業系統的特點,在分配執行緒棧時可將其預設大小_default_stacksize的值設為16k。修改後的執行緒棧空間的功能分配如圖3所示。

current_stack_frame>(curr-

}

list_for_each(entry, &_stack_user)

return result;

)

nptl中利用靜態變數stack_cache_maxsize限定了stack_cache的最大容量。在i386體系中stack_cache_maxsize的大小定義為40mb。顯然,這對於uclinux而言是不可能實現的,應針對具體系統資源進行適當調整。

2.3 c庫的修改

uclinux小型化的另乙個做法是精簡了應用程式庫,這使得執行緒庫中一些重要的系統呼叫在uclibc中缺少必要的介面,而無法得以實現。在本系統中,需要增加clone與futex兩個系統呼叫介面到uclibc中,以保證執行緒庫的正確執行。在nptl中利用靜態變數stack_cache_lock與lll_lock()/lll_unlock()這對巨集保證了執行緒棧佇列操作的原子性。在glibc中,lll_lock()/lll_unlock()最終是通過核心的futex(fast user space mutex)機制實現的。futex是一種序列化事件使得它們不會相互衝突的機制,它能令呼叫者在核心中等待,也可以在中斷或在超時以後被喚醒。在具體實現時需重定義這對巨集,並新增到uclibc中。lll_lock()/lll_unlock()的巨集定義演算法如下:

#define lll_lock(stack_cache_lock) /

#define lll_unlock(stack_cache_lock) /

3 效能測試與分析

測試的硬體平台採用了adi公司的adsp-bf533處理器,32mb的記憶體,4mb大小flash。軟體平台選用uclinux2.6核心。

3.1 相容性

在將nptl移植到uclinux上後,就其posix相容性進行了一系列測試,主要結果如表1所示。

表1 相容性測試結果對照

4 結束語

由於嵌入式系統軟硬體條件上的限制,使得nptl的高效性並不能完全得以體現。但相對於linuxthreads而言,在效能上仍有一定的提高。更重要的是,nptl相對於linuxthreads在很大程度上改進了與posix 的相容性。可以預見,隨著linux在嵌入式領域的擴充套件,nptl也將在嵌入式系統中發揮越來越重要的作用。

基於uClinux的Web Server的實現

隨著個人電腦和網際網路的迅速發展,嵌入式系統的開發也變的越來越流行,而基於linux的嵌入式作業系統的開發已經越來越受到人們的關注。uclinux是一款專門用於微型控制領域的嵌入式linux作業系統。它已經被成功地移植到了很多平台上。這裡主要以uclinux嵌入式作業系統為例來介紹嵌入式作業系統的有...

uclinux移植遇到的問題

但是遇到了一些問題 重起後,導致了出現 檔案的錯誤,不能用我的使用者名稱進行登入,搜尋網路後發現這個問題經常有人遇到,解決方法是登入到 然後執行 命令。或者 home username 我試了這兩種方法,不知道到底是哪個起作用了,再重啟的時候不再出現 dmrc 的錯誤,但是出現了更嚴重的 持續不到 ...

uCOS和uClinux的比較

摘自 uc os和uclinux作業系統,是當前得到廣泛應用的兩種免費且公開原始碼的嵌入式作業系統。uc os適合小型控制系統,具有執行效率高 占用空間小 實時效能優良和可擴充套件性強等特點,最小核心可編譯至2kb。uclinux則是繼承標準linux的優良特性,針對嵌入式處理器的特點設計的一種作業...