日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 充電吧
[導(dǎo)讀]轉(zhuǎn)載:http://blog.csdn.net/ipmux/article/details/19167605 MMU即內(nèi)存管理單元(Memory Manage Unit),是一個與軟件密切相關(guān)的硬件

轉(zhuǎn)載:http://blog.csdn.net/ipmux/article/details/19167605

MMU即內(nèi)存管理單元(Memory Manage Unit),是一個與軟件密切相關(guān)的硬件部件,也是理解linux等操作系統(tǒng)內(nèi)核機制的最大障礙之一。可以說,不懂MMU使很多人一直停滯在單片機與無OS的時代。博主之前對MMU也一直是霧里看花,似懂非懂。最近終于自認為云開霧散后,回頭總結(jié),感覺有幾個概念是阻礙人們理解MMU的元兇。
1)虛擬地址/物理地址
如果處理器沒有MMU,CPU內(nèi)部執(zhí)行單元產(chǎn)生的內(nèi)存地址信號將直接通過地址總線發(fā)送到芯片引腳,被內(nèi)存芯片接收,這就是物理地址(physical address),簡稱PA。英文physical代表物理的接觸,所以PA就是與內(nèi)存芯片physically connected的總線上的信號。
如果MMU存在且啟用,CPU執(zhí)行單元產(chǎn)生的地址信號在發(fā)送到內(nèi)存芯片之前將被MMU截獲,這個地址信號稱為虛擬地址(virtual address),簡稱VA,MMU會負責把VA翻譯成另一個地址,然后發(fā)到內(nèi)存芯片地址引腳上,即VA映射成PA,如下圖:

所以物理地址①是通過CPU對外地址總線②傳給Memory Chip③使用的地址;而虛擬地址④是CPU內(nèi)部執(zhí)行單元⑤產(chǎn)生的,發(fā)送給MMU⑥的地址。硬件上MMU⑥一般封裝于CPU芯片⑦內(nèi)部,所以虛擬地址④一般只存在于CPU⑦內(nèi)部,到了CPU外部地址總線引腳上②的信號就是MMU轉(zhuǎn)換過的物理地址①。
軟件上MMU對用戶程序不可見,在啟用MMU的平臺上(沒有MMU不必說,只有物理地址,不存在虛擬地址),用戶C程序中變量和函數(shù)背后的數(shù)據(jù)/指令地址等都是虛擬地址,這些虛擬內(nèi)存地址從CPU執(zhí)行單元⑤發(fā)出后,都會首先被MMU攔截并轉(zhuǎn)換成物理地址,然后再發(fā)送給內(nèi)存。也就是說用戶程序運行*pA =100;”這條賦值語句時,假設(shè)debugger顯示指針pA的值為0x30004000(虛擬地址),但此時通過硬件工具(如邏輯分析儀)偵測到的CPU與外存芯片間總線信號很可能是另外一個值,如0x8000(物理地址)。當然對一般程序員來說,只要上述語句運行后debugger顯示0x30004000位置處的內(nèi)存值為100就行了,根本無需關(guān)心pA的物理地址是多少。但進行OS移植或驅(qū)動開發(fā)的系統(tǒng)程序員不同,他們必須清楚軟件如何在幕后輔助硬件MMU完成地址轉(zhuǎn)換。
2)頁/頁幀/頁表/頁表項(PTE)
這幾個頁概念也噎倒了不少人,這里澄清下。MMU是負責把虛擬地址映射為物理地址,但凡”映射”都要解決兩個問題:映射的最小單位(粒度)和映射的規(guī)則。
MMU中VA到PA映射的最小單位稱為頁(Page),映射的最低粒度是單個虛擬頁到物理頁,頁大小通常是4K,即一次最少要把4K大小的VA頁塊整體映射到4K的PA頁塊(從0開始4K對齊劃分頁塊),頁內(nèi)偏移不變,如VA的一頁0x30004000~0x30004fff被映射到PA的一頁 0x00008000~0x00008fff,當CPU執(zhí)行單元訪問虛擬地址0x30004008,實際訪問的物理地址是0x00008008(0x30004008和0x00008008分別位于虛實兩套地址空間,互不相干,不存在重疊和沖突)。以頁為最小單位,就是不能把VA中某一頁劃分成幾小塊分別映射到不同PA,也不能把VA中屬于不同頁的碎塊映射到PA某一頁的不同部分,必須頁對頁整體映射。
頁幀(Page Frame)是指物理內(nèi)存中的一頁內(nèi)存,MMU虛實地址映射就是尋找物理頁幀的過程,對這個概念了解就可以了。
MMU軟件配置的核心是頁表(Page Table),它描述MMU的映射規(guī)則,即虛擬內(nèi)存哪(幾)個頁映射到物理內(nèi)存哪(幾)個頁幀。頁表由一條條代表映射規(guī)則的記錄組成,每一條稱為一個頁表條目(Page Table Entry,即PTE),整個頁表保存在片外內(nèi)存,MMU通過查找頁表確定一個VA應(yīng)該映射到什么PA,以及是否有權(quán)限映射。
但如果MMU每次地址轉(zhuǎn)換都到位于外部內(nèi)存的頁表上查找PTE,轉(zhuǎn)換速度就會大大降低,于是出現(xiàn)了
3)TLB
TLB (Translation Lookaside Buffers)即轉(zhuǎn)換快表,又簡稱快表,可以理解為MMU內(nèi)部專用的存放頁表的cache,保存著最近使用的PTE乃至全部頁表。MMU接收到虛擬地址后,首先在TLB中查找,如果找到該VA對應(yīng)的PTE就直接轉(zhuǎn)換,找不到再去外存頁表查找,并置換進TLB。TLB屬于片上SRAM,訪問速度快,通過TLB緩存PTE可以節(jié)省MMU訪問外存頁表的時間,從而加速虛實地址轉(zhuǎn)換。TLB和CPU cache的工作原理一樣,只是TLB專用于為MMU緩存頁表。
4)MMU的內(nèi)存保護功能
既然所有發(fā)往內(nèi)存的地址信號都要經(jīng)過MMU處理,那讓它只單單做地址轉(zhuǎn)換,豈不是浪費了這個特意安插的轉(zhuǎn)換層?顯然它有能力對虛地址訪問做更多的限定(就像路由器轉(zhuǎn)發(fā)網(wǎng)絡(luò)包的同時還能過濾各種非法訪問),比如內(nèi)存保護??梢栽赑TE條目中預(yù)留出幾個比特,用于設(shè)置訪問權(quán)限的屬性,如禁止訪問、可讀、可寫和可執(zhí)行等。設(shè)好后,CPU訪問一個VA時,MMU找到頁表中對應(yīng)PTE,把指令的權(quán)限需求與該PTE中的限定條件做比對,若符合要求就把VA轉(zhuǎn)換成PA,否則不允許訪問,并產(chǎn)生異常。
5)多級頁表
虛擬地址由頁號和頁內(nèi)偏移組成。什么東東呢?
前面說過MMU映射以頁為最小單位,假設(shè)頁大小為4K(212),那么無論頁表怎樣設(shè)置,虛擬地址后12比特與MMU映射后的物理地址后12比特總是相同,這不變的比特位就是頁內(nèi)偏移。為什么不變?拜托,把搭積木想象成一種映射,不管你怎么搭,你也改變不了每塊積木內(nèi)部的原子排列吧。所謂以頁為最小單位就是保持一部分不變作為最小粒度。
頁號就更有故事了,一個32bits虛擬地址,可以劃分為220個內(nèi)存頁,如果都以頁為單位和物理頁幀隨意映射,頁表的空間占用就是220*sizeof(PTE)*進程數(shù)(每個進程都要有自己的頁表),PTE一般占4字節(jié),即每進程4M,這對空間占用和MMU查詢速度都很不利。
問題是實際應(yīng)用中不需要每次都按最小粒度的頁來映射,很多時候可以映射更大的內(nèi)存塊。因此最好采用變化的映射粒度,既靈活又可以減小頁表空間。具體說可以把20bits的頁號再劃分為幾部分(如下圖linux的3級劃分)

簡單說每次MMU根據(jù)虛擬地址查詢頁表都是一級級進行,先根據(jù)PGD的值查詢,如果查到PGD的匹配,但后續(xù)PMD和PTE沒有,就以2(offset+pte+pmd)=1M為粒度進行映射,后20bits全部是塊內(nèi)偏移,與物理地址相同。
6)操作系統(tǒng)和MMU
實際上MMU是為滿足操作系統(tǒng)越來越復(fù)雜的內(nèi)存管理而產(chǎn)生的。OS和MMU的關(guān)系簡單說:
a.系統(tǒng)初始化代碼會在內(nèi)存中生成頁表,然后把頁表地址設(shè)置給MMU對應(yīng)寄存器,使MMU知道頁表在物理內(nèi)存中的什么位置,以便在需要時進行查找。之后通過專用指令啟動MMU,以此為分界,之后程序中所有內(nèi)存地址都變成虛地址,MMU硬件開始自動完成查表和虛實地址轉(zhuǎn)換。
b.OS初始化后期,創(chuàng)建第一個用戶進程,這個過程中也需要創(chuàng)建頁表,把其地址賦給進程結(jié)構(gòu)體中某指針成員變量。即每個進程都要有獨立的頁表。
c.用戶創(chuàng)建新進程時,子進程拷貝一份父進程的頁表,之后隨著程序運行,頁表內(nèi)容逐漸更新變化。比較復(fù)雜了,幾句講不清楚,不多說了哈,有時間講linux的話再說吧

總結(jié):
(1)當存在mmu時,存在兩種地址,物理地址和虛擬地址
(2)虛擬地址的大小由CPU的位數(shù)決定
(3)對用戶而言,操作的地址都是虛擬地址
(4)虛擬地址在從cpu發(fā)到外部地址總線上時,會先被mmu截獲,mmu經(jīng)過映射后產(chǎn)生物理地址,再發(fā)送到外部的地址總線上
(5)MMU得到虛擬地址后先在TLB內(nèi)查找,若沒找到匹配的PTE條目就到外部頁表查詢,并置換進TLB;根據(jù)PTE條目中對訪問權(quán)限的限定檢查該條VA指令是否符合,若不符合則不繼續(xù),并拋出exception異常;符合后根據(jù)VA的地址分段查詢頁表,保持offset(廣義)不變,組合出物理地址,發(fā)送出去。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在Linux系統(tǒng)性能優(yōu)化中,內(nèi)存管理與網(wǎng)絡(luò)連接處理是兩大核心領(lǐng)域。vm.swappiness與net.core.somaxconn作為關(guān)鍵內(nèi)核參數(shù),直接影響系統(tǒng)在高負載場景下的穩(wěn)定性與響應(yīng)速度。本文通過實戰(zhàn)案例解析這兩個...

關(guān)鍵字: Linux 內(nèi)存管理

C語言的內(nèi)存管理是程序性能的關(guān)鍵因素之一。標準庫提供的malloc、calloc、realloc和free函數(shù)雖能滿足基礎(chǔ)需求,但在高頻分配、實時性要求高或內(nèi)存碎片敏感的場景中,其開銷和不可控性成為瓶頸。自定義內(nèi)存池通過...

關(guān)鍵字: C語言 內(nèi)存管理

在C語言編程中,內(nèi)存管理是一項至關(guān)重要的技能。它直接關(guān)系到程序的性能和穩(wěn)定性,特別是在處理大型數(shù)據(jù)集或需要靈活內(nèi)存布局的場景下。其中,動態(tài)內(nèi)存分配是C語言內(nèi)存管理的一個重要組成部分,它允許程序在運行時根據(jù)需要請求和釋放內(nèi)...

關(guān)鍵字: C語言 內(nèi)存管理

在實時操作系統(tǒng)(RTOS)環(huán)境中,內(nèi)存管理是一項至關(guān)重要的任務(wù)。當多個任務(wù)同時運行時,內(nèi)存分配問題可能會變得尤為復(fù)雜。本文將探討一個常見的內(nèi)存管理陷阱:在RTOS環(huán)境中,當任務(wù)A成功調(diào)用malloc(512)而任務(wù)B的m...

關(guān)鍵字: 內(nèi)存管理 RTOS

在現(xiàn)代計算機系統(tǒng)中,內(nèi)存管理是一項至關(guān)重要的任務(wù),它直接關(guān)系到程序的執(zhí)行效率、穩(wěn)定性和安全性。為了滿足程序運行期間多樣化的內(nèi)存需求,內(nèi)存被巧妙地劃分為堆(Heap)和棧(Stack)兩大區(qū)域。這一劃分不僅體現(xiàn)了計算機系統(tǒng)...

關(guān)鍵字: 內(nèi)存管理 堆與棧

Linux系統(tǒng)中,內(nèi)存管理是一個復(fù)雜而關(guān)鍵的部分,它直接關(guān)系到系統(tǒng)的穩(wěn)定性和性能。Linux內(nèi)存管理子系統(tǒng)通過一系列精妙的機制,實現(xiàn)了對物理內(nèi)存和虛擬內(nèi)存的有效管理和調(diào)度。本文將深入探討Linux內(nèi)存管理的整體架構(gòu),包括...

關(guān)鍵字: Linux 內(nèi)存管理

關(guān)注「Linux大陸」,一起進步!本文作者:度白嵌入式任何程序運行起來都需要分配內(nèi)存空間存放該進程的資源信息的,C程序也不例外。C程序中的變量、常量、函數(shù)、代碼等等的信息所存放的區(qū)域都有所不同,不同的區(qū)域又有不同的特性。...

關(guān)鍵字: 嵌入式 內(nèi)存管理

本次給大家分享一位大佬寫的應(yīng)用于單片機內(nèi)存管理模塊mem_malloc,這個mem_malloc的使用不會產(chǎn)生內(nèi)存碎片,可以高效利用單片機ram空間。mem_malloc代碼倉庫:?https://github.com/...

關(guān)鍵字: 單片機 內(nèi)存管理

↓推薦關(guān)注↓內(nèi)存管理是C最令人切齒痛恨的問題,也是C最有爭議的問題,C高手從中獲得了更好的性能,更大的自由,C菜鳥的收獲則是一遍一遍的檢查代碼和對C的痛恨,但內(nèi)存管理在C中無處不在,內(nèi)存泄漏幾乎在每個C程序中都會發(fā)生,因...

關(guān)鍵字: 內(nèi)存管理

以下為CPU內(nèi)存管理的知識點總結(jié),梳理圖見文末。1、作為OS的基礎(chǔ),CPU能支持什么內(nèi)存訪問模型,OS就必須跟隨。2、IntelCPU支持分段與分頁兩種模型。3、IntelCPU的訪存模型是先分段再分頁的模式,所以涉及到...

關(guān)鍵字: CPU 內(nèi)存管理
關(guān)閉