為何Cortex-M處理器運行不了linux
單片機與應用處理器的核心區別到底是什么呢?是核心主頻的差異?還是Linux系統的支持?又或者是處理器的架構?本文將以NXP的Cortex-M系列為例做簡(jiǎn)要介紹。
本文引用地址:http://dyxdggzs.com/article/201805/380385.htm一、Cortex-M的定位
處理器的體系結構定義了指令集(ISA)和基于這一體系結構下處理器的程序員模型,通俗來(lái)講就是相同的ARM體系結構下的應用軟件是兼容的。從ARMv1到ARMv8,每一次體系結構的修改都會(huì )添加實(shí)用技術(shù)。
在A(yíng)RMv7版本中,內核架構首次從單一款式變成3種款式。Cortex-M系列屬于A(yíng)RMv7結構下的一個(gè)款式:款式M??钍組包含的處理器有Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4以及Cortex-M7,以上處理器常被用于低成本、低功耗、高可靠的嵌入式實(shí)時(shí)系統中。它們既可以用于“裸片”開(kāi)發(fā)又能運行實(shí)時(shí)操作系統,比如us/os-ll、VxWorks以及Aworks(致遠電子開(kāi)發(fā))等。

圖1 ARMv7下的Cortex系列
● 款式A:高性能的處理器級平臺,性能比肩計算機。
● 款式R:定位應用于高端嵌入式系統,高可靠及高時(shí)效性。
● 款式M:用于深度嵌入、定制的嵌入式系統。
值得注意的是,Cortex-M下的處理器沒(méi)有內存管理單元MMU。
二、內存管理單元MMU
內存管理單元簡(jiǎn)稱(chēng)MMU,它負責虛擬地址到物理地址的映射,并提供硬件機制的內存訪(fǎng)問(wèn)權限檢查。在多用戶(hù)、多進(jìn)程的操作系統中,MMU使得各個(gè)用戶(hù)進(jìn)程都有獨立的地址空間。

圖2 MMU的地位
任何微控制器都存在一個(gè)程序能夠產(chǎn)生的地址集和,被稱(chēng)為虛擬地址范圍。以32為機為例,虛擬地址范圍為0~0xFFFFFFFF (4G)。當該控制器尋址一個(gè)256M的內存時(shí),它的可用地址范圍被限定為0x00000000~0x0FFFFFFF(256M)。在沒(méi)有MMU的控制器中,虛擬地址被直接發(fā)送到內存總線(xiàn)上,以讀寫(xiě)該地址下的物理存儲器。在擁有MMU的控制器中,虛擬地址首先被發(fā)送到MMU中,被映射為物理地址后再發(fā)送到內存總線(xiàn)上。

圖3 內存管理機制
注:上圖僅簡(jiǎn)單反映內存管理的映射機制,權限映射、TLB快表、頁(yè)表等概念不做深入討論。
虛擬內存管理最主要的作用是讓每個(gè)進(jìn)程有獨立的地址空間。不同進(jìn)程中的同一個(gè)虛擬地址被MMU映射到不同的物理地址,并且在某一個(gè)進(jìn)程中訪(fǎng)問(wèn)任何地址都不可能訪(fǎng)問(wèn)到另外一個(gè)進(jìn)程的數據,這樣使得任何一個(gè)進(jìn)程由于執行錯誤指令或惡意代碼導致的非法內存訪(fǎng)問(wèn)都不會(huì )意外改寫(xiě)其它進(jìn)程的數據,不會(huì )影響其它進(jìn)程的運行,從而保證整個(gè)系統的穩定性。另一方面,每個(gè)進(jìn)程都認為自己獨占整個(gè)虛擬地址空間,這樣鏈接器和加載器的實(shí)現會(huì )比較容易,不必考慮各進(jìn)程的地址范圍是否沖突。
三、linux系統
一般將操作系統分為實(shí)時(shí)操作系統和非實(shí)時(shí)操作系統。實(shí)時(shí)操作系統大多為單進(jìn)程、多線(xiàn)程(多任務(wù)),因此不涉及到線(xiàn)程間的地址空間分配,不需要使用MMU,例如VxWorks。Linux系統屬于非實(shí)時(shí)性操作體統,多進(jìn)程是其主要特點(diǎn)。
以Ubuntu為例,打開(kāi)一個(gè)shell并且查看bash進(jìn)程的地址范圍如圖4,它的地址范圍為0x0000000000400000~0xffffffffff600000。

圖4 shell 1中的bash地址
我們打開(kāi)另一個(gè)shell,查看該shell中bash進(jìn)程的地址范圍,如圖5。不難發(fā)現,兩個(gè)不同bash進(jìn)程的地址范圍完全相同。其實(shí)操作系統或者用戶(hù)在fork()進(jìn)程時(shí)完全不需要考慮物理內存的地址分配,該工作由微控制器的內存管理單元MMU來(lái)做。

圖5 shell 2中的bash地址
既然是多進(jìn)程依賴(lài)了內存管理單元,那么在使用嵌入式linux時(shí)只開(kāi)一個(gè)進(jìn)程可以嗎?肯定是不可行的!開(kāi)機后即使用戶(hù)什么都不做,可見(jiàn)的系統運行必須的進(jìn)程已經(jīng)運行了幾十至上百個(gè),如圖6。

圖6 進(jìn)程樹(shù)
四、總結
綜合以上內容,linux系統對內存管理單元有極強的依賴(lài),若在沒(méi)有MMU的處理器中運行linux,恐怕整個(gè)系統只能停留在Uboot階段了。由于Cortex-m處理器沒(méi)有內存管理單元,因此跑不了linux系統。任何事情都不是絕對的,如果你重寫(xiě)了linux內核且搭配足夠大的內存芯片,從理論上來(lái)說(shuō)是可以省掉MMU的。但是,這樣的工作量,真的值得嗎?實(shí)際上,MMU就是為了解決操作系統越來(lái)越復雜的內存管理而產(chǎn)生的。
五、拓展部分
很大一部分開(kāi)發(fā)者選用嵌入式linux系統未能發(fā)揮出它的優(yōu)勢,僅僅是為了獲得開(kāi)發(fā)上的便利,比如以太網(wǎng)、4G上云、LCD驅動(dòng)、文件系統、圖像識別、python應用等等。那么有沒(méi)有方法既能使用傳統高實(shí)時(shí)性、低成本的單片機又不用面對繁瑣的硬件驅動(dòng)開(kāi)發(fā)呢?廣州致遠電子有限公司推出的全新AWorks平臺——IoT物聯(lián)網(wǎng)生態(tài)系統正是為此而生。
AWorks的誕生極大的降低了開(kāi)發(fā)者門(mén)檻,為開(kāi)發(fā)者提供便利,使開(kāi)發(fā)者可以忽略底層技術(shù)細節,專(zhuān)注產(chǎn)品“核心域”,更快的開(kāi)發(fā)出具有競爭力的產(chǎn)品。同時(shí),AWorks為開(kāi)發(fā)者提供的是高度抽象的通用接口,基于A(yíng)Works平臺的軟件與底層硬件無(wú)關(guān),可以“隨心所欲”的跨平臺復用(如更換MCU等等)??缃缬布钶dAWoeks IoT實(shí)時(shí)操作系統,讓您的開(kāi)發(fā)更容易,功能更強大。

評論