來講講Cortex-M、 ARM、和Linux

大雄45發表於2021-10-17
導讀 跑   作業系統需要什麼處理器?ARM9、ARM11?Cortex-M比ARM9更新,為什麼不能跑Linux?相信很多小夥伴都有類似這樣的疑問,下面圍繞Cortex-M、 ARM、 Linux來講講相關內容。

來講講Cortex-M、 ARM、和Linux來講講Cortex-M、 ARM、和Linux

ARM和Cortex-M

ARM處理器的體系結構定義了指令集(ISA)和基於這一體系結構下處理器的模型。ARM的指令集從ARMv1發展到今天的ARMv9,每一次體系結構的修改都會新增實用技術。

在ARMv6之前,其核心指令集架構都是單一款式,但在ARMv7開始,其指令集架構變成3種款式,即目前大家熟知的Cotex-M、 Cotex-R、 Cotex-A,或者ARMv7-A、ARMv7-R、 ARMv7-M這三款。

Cotex-M:主要指微處理器;

Cotex-R:主要指實時性處理器;

Cotex-A:主要指應用型處理器;

值得注意的是,Cortex-M下的處理器沒有記憶體管理單元MMU。

記憶體管理單元MMU

MMU:Memory Management Unit,記憶體管理單元。

記憶體管理單元主要負責從虛擬地址到實體地址的對映,並在硬體層對記憶體訪問許可權的檢查。在Linux等多使用者、多程式的作業系統中,MMU使得各個使用者程式都有獨立的地址空間,以防止記憶體越界。

MCU都有一個地址集和,被稱為虛擬地址範圍。以Cortex-M 32為機為例,虛擬地址範圍為0 ~ 0xFFFFFFFF (4G地址空間).當該控制器定址一個256M的記憶體時,它的可用地址範圍被限定為0 ~ 0x0FFFFFFF(256M)。

1.在沒有記憶體管理的處理器中,虛擬地址被直接傳送到記憶體匯流排上,以讀寫該地址下的物理儲存器。

2.在有記憶體管理的控制器中,虛擬地址首先被髮送到MMU中,被對映為實體地址後再傳送到記憶體匯流排上。

MMU虛擬記憶體管理最主要的作用是讓每個程式有獨立的地址空間。

不同程式中的同一個虛擬地址被MMU對映到不同的實體地址,並且在某一個程式中訪問任何地址都不可能訪問到另外一個程式的資料,這樣使得任何一個程式由於執行錯誤指令或惡意程式碼導致的非法記憶體訪問都不會意外改寫其它程式的資料,不會影響其它程式的執行,從而保證整個系統的穩定性。

另一方面,每個程式都認為自己獨佔整個虛擬地址空間,這樣連結器和載入器的實現會比較容易,不必考慮各程式的地址範圍是否衝突。

Liunx作業系統

作業系統通常分為實時作業系統和非實時作業系統。

1.實時作業系統大多為單程式、多執行緒(多工),因此不涉及到執行緒間的地址空間分配,不需要使用MMU,例如ucos、 FreeRTOS、 RT-Thread等。

2. 屬於非實時性操作體統,多程式是其主要特點,可以參考文章:Linux是實時系統還是分時作業系統?

以Ubuntu為例,開啟一個 並且檢視bash程式的地址範圍如圖4,它的地址範圍為0x0000000000400000~0xffffffffff600000。

我們開啟另一個shell,檢視該shell中bash程式的地址範圍,如圖5。不難發現,兩個不同bash程式的地址範圍完全相同。其實作業系統或者使用者在fork()程式時完全不需要考慮實體記憶體的地址分配,該工作由微控制器的記憶體管理單元MMU來做。

既然是多程式依賴了記憶體管理單元,那麼在使用嵌入式Linux時只開一個程式可以嗎?肯定是不可行的!開機後即使使用者什麼都不做,可見的系統執行必須的程式已經執行了幾十至上百個。

總結

透過上述描述我們可以知道,Linux作業系統對MMU(記憶體管理單元)有極強的依賴,若在沒有記憶體管理單元的CPU中執行Linux,恐怕整個系統只能停留在Uboot階段了。由於ARM的Cortex-M處理器沒有記憶體管理單元,,一般來說不建議跑Linux作業系統。

當然,任何事情都不是絕對的,如果你重寫了Linux核心且搭配足夠大的記憶體晶片,從理論上來說是可以省掉MMU的。

但是,這樣的工作量,真的值得嗎?實際上,MMU就是為了解決作業系統越來越複雜的記憶體管理而產生的。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2827085/,如需轉載,請註明出處,否則將追究法律責任。

相關文章