uclinux 多任務(各家之言)

     uClinux是專爲無存儲器管理單元(MMU)的微控制器打造的嵌入式Linux操作系統。uClinux首先被移植到摩托羅拉的MC68328 DragonBall集成微處理器上。從那以後, uClinux越來越受到業界的青睞, 被移植到更多的無MMU芯片上。目前,uClinux已成功移植到ARM7TDMI微處理器上。 由於uClinux主要是針對無MMU 微處理器開發的,大多數內核的二進制代碼和源代碼都被重寫,但保留了Linux 操作系統的主要優點:穩定性、優異的網絡能力以及優秀的文件系統支持。 uClinux的內存管理與傳統Linux區別最大的地方在標準Linux是針對有MMU的處理器設計的。在這種處理器上,虛擬地址被送到MMU,把虛擬 地址映射爲物理地址。通過賦予每個任務不同的虛擬物理地址轉換映射,支持不同任務之間的保護。對於uCLinux來說,其設計是針對沒有MMU的處理 器,即uCLinux不能使用處理器的虛擬內存管理技術。uCLinux仍然採用存儲器的分頁管理,系統在啓動時把實際存儲器進行分頁,在加載應用程序時 程序分頁加載。但是由於沒有MMU管理,所以uCLinux實際上是採用實存儲器管理策略的。這一點影響了系統工作的很多方面。uCLinux系統對於內 存的訪問是直接的,所有程序中訪問的地址都是實際的物理地址。操作系統對內存空間沒有保護,各個進程實際上共享一個運行空間。一個進程在執行前,系統必須 爲進程分配足夠的連續地址空間,然後全部載入主存儲器的連續空間中。

 

    多進程管理

  由於uClinux沒有MMU管理存儲器,在實現多個進程時需要實現數據保護。uClinux的雖然支持fork函數,但其實質是和vfork:實際上uClinux所有的多進程管理都通過vfork來實現。

  vfork不拷貝父進程的頁面,只是初始化私有的數據結構與準備足夠的分頁表。調用完成後父子進程事實上共享同一塊存儲器,因此子進程可以更改父進程的數據及堆棧信息,所有父進程進入睡眠,直到子進程執行exec。當子進程正確開始執行後,將喚醒父進程,使得父進程繼續往後執行。這意味着uClinux系統fork調用完程後,要麼子進程代替父進程執行(此時父進程已經休眠)直到子進程調用exit退出,要麼調用exec執行一個新的進程。

  vfork是uClinux與標準Linux應用程序的開發中最重要的不同之處,只有對vfork與fork兩個函數的差異和程序處理有詳細的瞭解才能順利地完成從Linux到uClinux的程序移植。

 

      標準Linux使用虛擬存儲器技術,對於uClinux來說,其設計針對沒有MMU(memory management unit) 的處理器。但uClinux仍然採用存儲器的分頁管理,系統在啓動時把實際存儲器進行分頁。在加載應用程序時程序分頁加載。但是由於沒有MMU管理,所以實際上uClinux採用實存儲器管理策略(real memory management)。uClinux系統對於內存的訪問是直接的,它對地址的訪問不需要經過MMU,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址。 uClinux對內存的管理從編譯內核開始,從而系統將在啓動的初始化階段對內存進行分頁,並且標記已使用的和未使用的內存。系統將在運行應用時使用這些分頁內存。另外由於採用實存儲器管理策略,用戶程序同內核以及其他用戶程序在一個地址空間,程序開發時要保證不侵犯其他程序的地址空間,以使得程序不至於破壞系統的正常工作,或導致其他程序的運行異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章