共計 3474 個字符,預(yù)計需要花費 9 分鐘才能閱讀完成。
這篇文章主要講解了“uclinux 和 linux 的區(qū)別有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“uclinux 和 linux 的區(qū)別有哪些”吧!
區(qū)別:1、uclinux 采用存儲器的分頁管理,linux 采用虛擬內(nèi)存管理;2、uclinux 沒有 fork 系統(tǒng)調(diào)用,使用 vfork,而 linux 使用 fork 系統(tǒng)調(diào)用;3、uclinux 不能運行時增加進(jìn)程棧,linux 可以在運行時增加進(jìn)程棧。
本教程操作環(huán)境:linux7.3 系統(tǒng)、Dell G3 電腦。
uclinux 和 linux 的區(qū)別是什么
在 uClinux 這個英文單詞中 u 表示 Micro,小的意思,C 表示 Control,控制的意思,
所以 uClinux 就是 Micro-Control-Linux,字面上的理解就是 針對微控制領(lǐng)域而設(shè)計的 Linux 系統(tǒng)。
ucLinux 與 linux 區(qū)別
沒有虛存管理
不能運行時增加進(jìn)程棧
不支持分頁
可執(zhí)行程序不是 elf, 而是 flat
不能用 fork, 而是用 vfork
RAMDISK
uClinux 是針對控制領(lǐng)域的嵌入式 linux 操作系統(tǒng),它從 Linux 2.0/2.4 內(nèi)核派生而來,沿襲了主流 Linux 的絕大部分特性。
適合不具備內(nèi)存管理單元 (MMU) 的微處理器 / 微控制器。沒有 MMU 支持是 uClinux 與主流 Linux 的基本差異。
對 uCLinux 來說,其設(shè)計針對沒有 MMU 的處理器,不能使用處理器的虛擬內(nèi)存管理技術(shù)。uCLinux 仍然采用存儲器的分頁管理,系統(tǒng)在啟動時把實際存儲器進(jìn)行分頁。在加載應(yīng)用程序時程序分頁加載。但是由于沒有 MMU 管理,所以實際上 uCLinux 采用實存儲器管理策略。
uCLinux 系統(tǒng)對于內(nèi)存的訪問是直接的,所 有程序中訪問的地址都是實際的物理地址。操作系統(tǒng)對內(nèi)存空間沒有保護(hù),各個進(jìn)程實際上共享一個運行空間。一個進(jìn)程在執(zhí)行前,系統(tǒng)必須為進(jìn)程分配足夠的連續(xù) 地址空間,然后全部載入主存儲器的連續(xù)空間中。
沒有內(nèi)存保護(hù) (Memory Protection) 的操作會導(dǎo)致這樣的結(jié)果:
即使由無特權(quán)的進(jìn)程來調(diào)用一個無效指針,也會觸發(fā)一個地址錯誤,并潛在地引起程序崩潰,甚至導(dǎo)致系統(tǒng)的掛 起。顯然,在這樣的系統(tǒng)上運行的代碼必須仔細(xì)編程,并深入測試來確保健壯性和安全。
對于普通的 Linux 來說,需要運行不同的用戶程序,如果沒有內(nèi)存保護(hù)將大大降低系統(tǒng)的安全性和可 * 性;然而對于嵌入式 uClinux 系統(tǒng)而言,由 于所運行的程序往往是在出廠前已經(jīng)固化的,不存在危害系統(tǒng)安全的程序侵入的隱患,因此只要應(yīng)用程序經(jīng)過較完整的測試,出現(xiàn)問題的概率就可以控制在有限的范 圍內(nèi)。
沒有虛擬內(nèi)存 (Virtual Memory) 主要導(dǎo)致下面幾個后果:
首先,由內(nèi)核所加載的進(jìn)程必須能夠獨立運行,與它們在內(nèi)存中的位置無關(guān)。實現(xiàn)這一目標(biāo)的第一種辦法是一旦程序被加載到 RAM 中,那么程序的基準(zhǔn)地址 就“固定”下來;另一種辦法是產(chǎn)生只使用相對尋址的代碼(稱為“位置無關(guān)代碼”,Position Independent Code,簡稱 PIC)。uClinux 對這兩種模式都支持。
其次,要解決在扁平 (flat) 的內(nèi)存模型中的內(nèi)存分配和釋放問題。非常動態(tài)的內(nèi)存分配會造成內(nèi)存碎片,并可能耗盡系統(tǒng)的資源。對于使用了動態(tài)內(nèi)存 分配的那些應(yīng)用程序來說,增強(qiáng)健壯性的一種辦法是用預(yù)分配緩沖區(qū)池 (Preallocated buffer pool) 的辦法來取代 malloc()調(diào)用。
由于 uclinux 中不使用虛擬內(nèi)存,進(jìn)出內(nèi)存的頁面交換也沒有實現(xiàn),因為不能保證頁面會被加載到 RAM 中的同樣位置。在普通計算機(jī)上,操作系統(tǒng)允 許應(yīng)用程序使用比物理內(nèi)存 (RAM) 更大的內(nèi)存空間,這往往是通過在硬盤上設(shè)立交換分區(qū)來實現(xiàn)的。但是,在嵌入式系統(tǒng)中,通常都用 FLASH 存儲器來代替 硬盤,很難高效地實現(xiàn)內(nèi)存頁面交換的存取,因此,對運行的應(yīng)用程序都限制其可分配空間不大于系統(tǒng)的 RAM 空間。
多任務(wù)并沒有受影響。哪些舊式的、廣泛使用 fork()的網(wǎng)絡(luò)后臺程序(daemon)的確是需要修改的。由于子進(jìn)程運行在和父進(jìn)程同樣的地 址空間內(nèi),在一些情況下,也需要修改兩個進(jìn)程的行為。
很多現(xiàn)代的程序依賴子進(jìn)程來執(zhí)行基本任務(wù),使得即時在進(jìn)程負(fù)載很重時,系統(tǒng)仍可以保持一種“可交互”的狀態(tài),這些程序可能需要實質(zhì)上的修改來在 uClinux 下完成同樣的任務(wù)。如果一個關(guān)鍵的應(yīng)用程序非常依賴這樣的結(jié)構(gòu),那就不得不對它重新編寫了。
假設(shè)有一個簡單的網(wǎng)絡(luò)后臺程序(daemon),大量使用了 fork()。這個 daemon 總監(jiān)聽一個知名端口(或套接字)等待網(wǎng)絡(luò)客戶端來連接。當(dāng)客戶端連接時,這個 daemon 給它一個新的連接信息(新的 socket 編號),并調(diào)用 fork()。子進(jìn)程接下來就會和客戶端在新的 socket 上進(jìn) 行連接,而父進(jìn)程被釋放,可以繼續(xù)監(jiān)聽新的連接。
uClinux 既沒有自動生長的堆棧,也沒有 brk()函數(shù),這樣,用戶空間的程序必須使用 mmap() 命令來分配內(nèi)存。為了方便,在 uclinux 的 C 語言庫中所實現(xiàn)的 malloc()實質(zhì)上就是一個 mmap()。在編譯時,可以指定程序的堆棧大小。
最后,uClinux 目標(biāo)板處理器缺乏內(nèi)存管理的硬件單元,使得 Linux 的系統(tǒng)接口需要作些改變。有可能最大的不同就是沒有 fork()和 brk()系統(tǒng)調(diào)用。調(diào)用 fork()將復(fù)制出進(jìn)程來創(chuàng)建一個子進(jìn)程。在 Linux 下,fork()是使用 copy-on-write 頁面來實現(xiàn)的。由于 沒有 MMU,uclinux 不能完整、可 * 地復(fù)制一個進(jìn)程,也沒有對 copy-on-write 的存取。為了彌補(bǔ)這一缺陷,uClinux 實現(xiàn)了 vfork(),當(dāng)父 進(jìn)程調(diào)用 vfork()來創(chuàng)建子進(jìn)程時,兩個進(jìn)程共享它們的全部內(nèi)存空間,包括堆棧。子進(jìn)程要么代替父進(jìn)程執(zhí)行(此時父進(jìn)程已經(jīng) sleep)直到子進(jìn)程調(diào) 用 exitI()退出,要么調(diào)用 exec()執(zhí)行一個新的進(jìn)程,這個時候?qū)a(chǎn)生可執(zhí)行文件的加載。即使這個進(jìn)程只是父進(jìn)程的拷貝,這個過程也不能避免。當(dāng) 子進(jìn)程執(zhí)行 exit()或 exec()后,子進(jìn)程使用 wakeup 把父進(jìn)程喚醒,父進(jìn)程繼續(xù)往下執(zhí)行。
通用架構(gòu)的內(nèi)核變化:
在 uCLinux 的發(fā)布中,/linux/mmnommu 目錄取代了 /linux/mm 目錄. 前者是修改后的內(nèi)存管理子系統(tǒng) 被修改, 去除了 MMU 的硬件依賴, 并在內(nèi)核軟件自身提供基本的內(nèi)管理函數(shù).
很多子系統(tǒng)需要重新修改, 添加或重寫. 內(nèi)核和用戶內(nèi)存分配及釋放進(jìn)程 必須重新實現(xiàn), 對透明交互 / 頁面調(diào)度的支持也被去除. 內(nèi)核中, 加入了支持 內(nèi)核無關(guān)代碼(PIC) 的程序支持模塊, 并使用了新的二進(jìn)制目標(biāo)代碼 格式, 稱扁平格式, 用來支持 PIC(有非常緊湊的頭部).
內(nèi)核也提供了支持 ELF 格式的程序加載模塊, 用來支持使用固定基準(zhǔn)地址的可執(zhí)行程序. 兩種模式各 有利弊, 傳統(tǒng)的 PIC 運行快, 代碼緊湊, 但有代碼大小限制. 例如 Motorola 68K 架構(gòu)的 16 位相對跳轉(zhuǎn)限制了 PIC 程序不能超過 32KB 大小, 而采用運行期固定基準(zhǔn)地址的方法上市的程序代碼沒有了大小限制, 但當(dāng)陳旭被內(nèi)核加載后 導(dǎo)致了較多的系統(tǒng)開銷. 對于內(nèi)核開發(fā)者來說,uCLinux 基本上與 Linux 沒有區(qū)別, 唯一的區(qū)別就是不能利用 MMU 提供的內(nèi)存管理. 實際上這對內(nèi)核并 沒有影響. Linux 下所有標(biāo)準(zhǔn)的可執(zhí)行文件的格式在 uCLinux 并不被支持, 因為這些格式也用到了虛擬內(nèi)存的一些功能.uCLinux 使用的 是另外一種扁平格式. 扁平格式是一種簡潔高效的可執(zhí)行文件格式, 它值包含可執(zhí)行的代碼和數(shù)據(jù), 還有一些把可執(zhí)行文件加載到內(nèi)存任意位置所需要的可重定位的 信息.
總結(jié):在應(yīng)用程序移植到 uClinux,以及自己寫代碼的過程中,我們將始終圍繞這幾個特性來做:
1、在 configure 時,如果可能則需要在 configure 時,選上—disable-shared 和—enable-static.
2、將 源代碼中所有出現(xiàn)的 fork()改成 vfork();
3、在 Makefile 中 的交叉編譯器和編譯選項,鏈接選項里加上 -Wl,-elf2flt。盡管這只是一個鏈接選項,但我 還是小心地在 LDFLAGS 和 CFLAGS,甚至在 CC 中指定了該選項。
感謝各位的閱讀,以上就是“uclinux 和 linux 的區(qū)別有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對 uclinux 和 linux 的區(qū)別有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!