電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 36|回復: 0
收起左側(cè)

MMU 對于 linux 的重要性

[復制鏈接]

359

主題

359

帖子

3318

積分

四級會員

Rank: 4

積分
3318
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-8 11:45:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
關注+星標公眾,不錯過精彩內(nèi)容

素材來源 | 網(wǎng)絡

MMU:Memory Management Unit,內(nèi)存管理單元。搞嵌入式開發(fā)的小伙伴都應該了解并掌握的一項知識。
你肯定會好奇,為什么RTOS可以不用MMU,而linux沒它卻不行?
什么是MMU?
MMU(Memory Management Unit,內(nèi)存管理單元)是一種硬件模塊,用于在CPU和內(nèi)存之間實現(xiàn)虛擬內(nèi)存管理。
其主要功能是將虛擬地址轉(zhuǎn)換為物理地址,同時提供訪問權限的控制和緩存管理等功能。MMU是現(xiàn)代計算機操作系統(tǒng)中重要的組成部分,可以提高系統(tǒng)的穩(wěn)定性和安全性。
在內(nèi)存管理方面,MMU可以通過頁面表(Page Table)實現(xiàn)虛擬內(nèi)存管理。頁面表是一種數(shù)據(jù)結構,記錄了每個虛擬頁面和其對應的物理頁面之間的映射關系。

當CPU發(fā)出一個虛擬地址時,MMU會通過頁面表查找并將其轉(zhuǎn)換為對應的物理地址。此外,MMU還可以通過頁面表實現(xiàn)內(nèi)存保護和共享等功能,從而提高系統(tǒng)的安全性和效率。總之,MMU是內(nèi)存管理中一個重要的硬件組件,可以實現(xiàn)虛擬內(nèi)存管理、內(nèi)存保護、共享和緩存等功能,為現(xiàn)代計算機操作系統(tǒng)的穩(wěn)定性和安全性提供支持。舉個例子假設我們有一個程序,它需要訪問兩個內(nèi)存區(qū)域:一個是只讀的代碼區(qū)域,一個是可讀寫的數(shù)據(jù)區(qū)域。我們現(xiàn)在想要在一個沒有 MMU 的系統(tǒng)上運行這個程序。如果沒有 MMU,代碼區(qū)域和數(shù)據(jù)區(qū)域就只能被映射到兩個固定的物理地址上。這就意味著,如果程序嘗試訪問一個不正確的地址,可能會導致系統(tǒng)崩潰,F(xiàn)在,如果我們在一個具有 MMU 的系統(tǒng)上運行這個程序,情況會有所不同。MMU 可以將程序嘗試訪問的地址映射到不同的物理地址,這樣可以使得代碼區(qū)域和數(shù)據(jù)區(qū)域在物理內(nèi)存中不再是固定的位置。這意味著,如果程序嘗試訪問不正確的地址,MMU 可以通過重新映射來保護系統(tǒng)不崩潰。MMU 還可以將多個虛擬地址映射到同一個物理地址上,這就是所謂的頁共享(page sharing),可以減少物理內(nèi)存的使用。

如果沒有MMU,程序訪問內(nèi)存時只能使用物理地址,而物理地址是直接映射到內(nèi)存芯片上的地址,程序可以隨意訪問任何一個物理地址。這種情況下,程序如果訪問了錯誤的地址或試圖訪問未被授權的地址,就會產(chǎn)生訪問錯誤或非法訪問,可能導致系統(tǒng)崩潰、數(shù)據(jù)丟失等問題。而有了MMU,程序訪問的是虛擬地址,由MMU負責將虛擬地址映射到物理地址上,這樣程序就無法直接訪問物理地址。同時,MMU可以根據(jù)內(nèi)存訪問權限來限制程序?qū)?nèi)存的訪問,確保系統(tǒng)的安全性和穩(wěn)定性。因此,沒有MMU時,程序可能會訪問到其他地址,而有了MMU,程序只能訪問被允許訪問的地址,可以有效地避免非法訪問的問題。為什么相同的虛擬地址空間在物理地址不會發(fā)生沖突呢?
相同的虛擬地址空間在不同的進程中可能會映射到不同的物理地址,這個映射的過程是由MMU完成的。在操作系統(tǒng)中,每個進程都有獨立的虛擬地址空間,且這些虛擬地址空間互不干擾。MMU會將每個進程的虛擬地址映射到對應的物理地址上,使得不同進程間的內(nèi)存訪問不會相互干擾。同時,MMU也會提供一些安全機制,如頁面保護等,來防止進程越界訪問內(nèi)存或訪問其他進程的內(nèi)存。因此,MMU起到了保護進程間內(nèi)存互不干擾的作用,也是現(xiàn)代操作系統(tǒng)的重要組成部分。頁表是什么?頁表是一種用于存儲虛擬內(nèi)存地址與物理內(nèi)存地址映射關系的數(shù)據(jù)結構。在使用虛擬內(nèi)存的系統(tǒng)中,每個進程都有自己的虛擬地址空間,而這些虛擬地址空間被分割成許多頁(通常大小為4KB或更大),而不是一整塊連續(xù)的內(nèi)存。因此,當進程需要訪問某個虛擬地址時,需要將其翻譯成對應的物理地址。這個翻譯過程就是通過頁表來完成的。頁表的基本原理是將虛擬地址劃分成一個頁號和一個偏移量。頁號用于在頁表中查找對應的物理頁幀號,而偏移量則用于計算該虛擬地址在物理頁幀中的偏移量。通過這種方式,就可以將虛擬地址映射到物理地址,使得進程可以訪問對應的內(nèi)存區(qū)域。頁表一般由操作系統(tǒng)來維護,因為操作系統(tǒng)需要掌握虛擬地址和物理地址之間的映射關系。在使用MMU(Memory Management Unit)的硬件支持的系統(tǒng)中,當進程訪問虛擬地址時,MMU會通過頁表將虛擬地址轉(zhuǎn)換為物理地址,并將訪問指向正確的物理地址。這樣,進程就可以在不知道自己真實物理地址的情況下訪問內(nèi)存。
為什么沒有MMU就無法運行Linux系統(tǒng)?
這是因為 Linux 內(nèi)核將虛擬地址空間分為多個頁面,并將這些頁面映射到物理地址空間上,以實現(xiàn)內(nèi)存隔離、保護和虛擬內(nèi)存等功能。沒有 MMU,就無法實現(xiàn)這種映射,從而無法運行 Linux 系統(tǒng)。為什么有些較為簡單的SOC可能沒有MMU,但仍然可以運行一些嵌入式操作系統(tǒng)或者裸機程序?RTOS可以運行在沒有MMU的系統(tǒng)上,因為RTOS通常不需要進行內(nèi)存保護和虛擬地址映射等高級特性。相反,RTOS的設計側(cè)重于實時性和低延遲,因此通常只需要簡單的內(nèi)存管理和任務調(diào)度即可。這使得RTOS可以運行在許多嵌入式系統(tǒng)上,包括一些沒有MMU的系統(tǒng)。
聲明:本文素材來源網(wǎng)絡,版權歸原作者所有。如涉及作品版權問題,請與我聯(lián)系刪除。
------------ END ------------

●專欄《嵌入式工具●專欄《嵌入式開發(fā)》●專欄《Keil教程》●嵌入式專欄精選教程
關注公眾號回復“加群”按規(guī)則加入技術交流群,回復“1024”查看更多內(nèi)容。


點擊“閱讀原文”查看更多分享。
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表