區別:1、uclinux採用記憶體的分頁管理,linux採用虛擬記憶體管理;2、uclinux沒有fork系統呼叫,使用vfork,而linux使用fork系統呼叫;3、uclinux不能執行時增加程序棧,linux可以在執行時增加程序棧。
本教學操作環境:linux7.3系統、Dell G3電腦。
在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的區別是什麼的詳細內容,更多請關注TW511.COM其它相關文章!