首頁 >運維 >linux運維 >uclinux和linux的差別是什麼

uclinux和linux的差別是什麼

WBOY
WBOY原創
2022-05-17 11:02:504154瀏覽

區別:1、uclinux採用記憶體的分頁管理,linux採用虛擬記憶體管理;2、uclinux沒有fork系統調用,使用vfork,而linux使用fork系統調用;3、uclinux不能運行時增加進程棧,linux可以在運行時增加進程棧。

uclinux和linux的差別是什麼

本教學操作環境:linux7.3系統、Dell G3電腦。

uclinux和linux的差別是什麼

在uClinux這個英文單字中u表示Micro,小的意思,C表示Control,控制的意思,

所以uClinux就是Micro-Control-Linux,字面上的理解就是"針對微控制領域而設計的Linux系統"。

ucLinux與linux區別

  • #沒有虛存管理

  • ##不能運行時增加進程棧

  • 不支援分頁

  • 執行程式不是elf,   而是flat

  • 不能用fork,   而是用vfork

  • RAMDISK  

uClinux是針對控制領域的嵌入式linux作業系統,它從Linux 2.0/2.4內核衍生而來,沿襲了主流Linux的絕大部分特性。

適合不具備記憶體管理單元(MMU)的微處理器/微控制器。沒有MMU支援是 uClinux與主流Linux的基本差異。 

對uCLinux 來說,其設計針對沒有MMU的處理器,不能使用處理器的虛擬記憶體管理技術。 uCLinux仍然採用記憶體的分頁管理,系統在啟動時把實際記憶體分頁。在載入應用程式時程式分頁載入。但是由於沒有MMU管理,所以實際上uCLinux採用實記憶體管理策略。

uCLinux系統對於記憶體的存取是直接的,所 有程式中存取的位址都是實際的實體位址。作業系統對記憶體空間沒有保護,各個行程實際上共享一個運行空間。一個行程在執行前,系統必須為行程分配足夠的連續 位址空間,然後全部載入主記憶體的連續空間。

沒有記憶體保護(Memory Protection)的操作會導致這樣的結果:

即使由無特權的程序來呼叫無效指針,也會觸發一個位址錯誤,並潛在地引起程式崩潰,甚至導致系統的掛起。顯然,在這樣的系統上運行的程式碼必須仔細編程,並深入測試以確保健壯性和安全性。

對於普通的Linux來說,需要運行不同的使用者程序,如果沒有記憶體保護將大大降低系統的安全性和可*性;然而對於嵌入式uClinux系統而言,由於所執行的程序往往是在出廠前已經固化的,不存在危害系統安全的程序侵入的隱患,因此只要應用程式經過較完整的測試,出現問題的機率就可以控制在有限的範圍內。

沒有虛擬記憶體(Virtual Memory)主要導致下面幾個後果:

首先,由核心所載入的進程必須能夠獨立運行,與它們在記憶體中的位置無關。實現這一目標的第一種方法是一旦程式被載入到RAM中,那麼程式的基準位址就「固定」下來;另一種辦法是產生只使用相對尋址的程式碼(稱為“位置無關程式碼” ,Position Independent Code,簡稱PIC)。 uClinux對這兩種模式都支援。

其次,要解決在扁平(flat)的記憶體模型中的記憶體分配和釋放問題。非常動態的記憶體分配會造成記憶體碎片,並可能耗盡系統的資源。對於使用了動態記憶體 分配的那些應用程式來說,增強健全性的一種辦法是用預先分配緩衝區池(Preallocated buffer pool)的辦法來取代malloc()呼叫。

由於uclinux中不使用虛擬內存,進出內存的頁面交換也沒有實現,因為不能保證頁面會被加載到RAM中的相同位置。在普通電腦上,作業系統允 許應用程式使用比實體記憶體(RAM)更大的記憶體空間,這往往是透過在硬碟上設立交換分區來實現的。但是,在嵌入式系統中,通常都用FLASH記憶體來代替 硬碟,很難有效率地實現記憶體頁面交換的訪問,因此,對運行的應用程式都限制其可分配空間不大於系統的RAM空間。  

多重任務並沒有受影響。哪些舊式的、廣泛使用fork()的網路後台程式(daemon)的確是需要修改的。由於子行程運行在和父行程同樣的地 址空間內,在某些情況下,也需要修改兩個行程的行為。

許多現代的程式依賴子進程來執行基本任務,使得即時在進程負載很重時,系統仍可以保持一種「可交互」的狀態,這些程序可能需要實質上的修改來在uClinux下完成同樣的任務。如果一個關鍵的應用程式非常依賴這樣的結構,那就不得不對它重新編寫了。

假設有一個簡單的網路後台程式(daemon),大量使用了fork()。這位daemon總監聽一個知名埠(或套接字)等待網路客戶端來連線。當客戶端連接時,這個daemon給它一個新的連接資訊(新的socket編號),並且呼叫fork()。子進程接下來就會和客戶端在新的socket上進 行連接,而父進程被釋放,可以繼續監聽新的連接。

uClinux 既沒有自動生長的堆疊,也沒有brk()函數,這樣,使用者空間的程式必須使用mmap() 指令來分配記憶體。為了方便,在uclinux的C語言庫中所實現的malloc()實質上就是一個mmap()。在編譯時,可以指定程式的堆疊大小。

最後,uClinux目標板處理器缺乏記憶體管理的硬體單元,使得Linux的系統介面需要做些改變。有可能最大的不同就是沒有fork()和 brk()系統呼叫。呼叫fork()將複製出一個行程來建立一個子程序。在Linux下,fork()是使用copy-on-write頁面實現的。由於 沒有MMU, uclinux不能完整、可*地複製一個進程,也沒有對copy-on-write的存取。為了彌補這個缺陷,uClinux實作了vfork(),當父 程序呼叫vfork()來建立子程序時,兩個程序共享它們的全部記憶體空間,包括堆疊。子進程要麼取代父進程執行(此時父進程已經sleep)直到子進程調 用exitI()退出,要麼呼叫exec()執行一個新的進程,這個時候將產生可執行檔的載入。即使這個進程只是父進程的拷貝,這個過程也不能避免。當 子行程執行exit()或exec()後,子行程使用wakeup把父行程喚醒,父行程繼續往下執行。

通用架構的核心變化:

在uCLinux的發布中,/linux/mmnommu目錄取代了/linux/mm目錄.前者是修改後的記憶體管理子系統被修改,移除了MMU的硬體依賴,並在內核軟體本身提供基本的內管理函數.

很多子系統需要重新修改,添加或重寫.內核和用戶內存分配及釋放進程必須重新實現,對透明互動/頁面調度的支援也被去除. 核心中,加入了支援"核心無關程式碼(PIC)"的程式支援模組,並使用了新的二進位目標程式碼格式,稱扁平格式,用來支援PIC(有非常緊湊的頭部).

核心也提供了支援ELF格式的程式載入模組,用來支援使用固定基準位址的可執行程式.兩種模式各有利弊,傳統的PIC運作快,程式碼緊湊,但有程式碼大小限制.例如Motorola 68K架構的16位元相對跳轉限制了PIC程式不能超過32KB大小,而採用運行期固定基準位址的方法上市的程式碼沒有了大小限制,但當陳旭被核心載入後導致了較多的系統開銷.對於核心開發者來說,uCLinux基本上與Linux沒有區別,唯一的區別就是不能利用MMU提供的記憶體管理.實際上這對核心並沒有影響. Linux下所有標準的可執行檔的格式在uCLinux並不被支援,因為這些格式也用到了虛擬記憶體的一些功能.uCLinux使用的是另外一種扁平格式.扁平格式是一種簡潔高效的可執行檔格式,它值包含可執行的程式碼和資料,還有一些把可執行檔載入到記憶體任意位置所需要的可重定位的資訊.  

總結:在應用程式移植到uClinux,以及自己寫程式碼的過程中,我們將永遠圍繞著這幾個特性來做:

1、在configure時, 如果可能需要在configure時,選上—disable-shared和—enable-static.

2、將原始碼中所有出現的fork()改成vfork();

3、在Makefile中的交叉編譯器和編譯選項,連結選項裡加上-Wl,-elf2flt。儘管這只是一個連結選項,但我 還是小心地在LDFLAGS和CFLAGS, 甚至在CC中指定了該選項。    

推薦學習:Linux影片教學

#

以上是uclinux和linux的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn