硬件講了 sram sdram ddr3
驅動講了 控制器初始化 讀寫內存
內存管理2.0主要講軟件對內存的管理(分塊及保護及管理)
關於內存管理2.0,其實也講了一部分,對內存的分段應該就屬於內存2.0的
現在要講 內存保護(MPU MMU) buddy slab
內存管理流程
剛加載到內存,還沒運行代碼的時候,最多隻有.code .ro-data .data
而 .bss .stack .heap 是代碼建立起來的.
內存管理的主要功能有:內存分配、內存保護、地址映射和內存擴充。
對內存的管理的日益增長的需求及解決方案
只有 .code .ro-data .data .bss .stack .heap 不能滿足嗎?
一開始是裸機程序,安排好這些就夠了.
需要多道程序併發運行,這就需要內存方面有改善
內存分配:爲每道程序分配內存。
需要OS支持,並給每個程序的程序內存空間做分塊.
每一個程序對應一個task_struct結構體,該結構體中一個成員類似 linux內核中的task_struct中的mm成員,指向進程所管理的內存的一個總的抽象的數據結構mm_struct
內存保護:確保每道用戶程序都只在自己的內存空間運行,彼此互不干擾。
MPU的支持
用系統控制處理器(CP15)寄存器來完全定義保護區域
基於區域,不是基於頁面,控制顆粒度要比VMSA少
不支持虛擬到物理地址的映射
物理內存地址始終與ARM處理器生成的虛擬地址相同
地址映射:將地址空間的邏輯地址轉換爲內存空間與對應的物理地址。
MMU的支持
用翻譯表來定義保護頁面
基於頁面,不是基於區域,控制顆粒度要比PMSA多(MMU允許對內存系統進行細粒度控制)
翻譯表存儲在內存中,然後常用的部分被加載到TLB(TLB通過緩存轉換表遍歷的結果來降低內存訪問的平均成本。)
執行完整翻譯表查找的過程稱爲 translation table walk,它由硬件自動執行,並且在執行時間上有很大的開銷,至少有一個主內存訪問,通常有兩個
支持虛擬到物理地址的映射
由ARM®處理器生成的地址稱爲虛擬地址
MMU允許將此地址映射到不同的物理地址。此物理地址標識正在訪問的主內存位置。
內存擴充:用於實現請求調用功能,置換功能等。
就是內存不夠的時候,將不常用的內存數據A 放到flash的文件B裏面,然後釋放這些不常用的內存A.可使用內存就會增加. 在使用這些不常用內存A的時候,再加載B到內存.
https://blog.csdn.net/No1_tiger/article/details/75126974
https://blog.csdn.net/u012489236/article/details/104172649