嵌入式linux開發 (二十九) 內存管理2.0(1) 內存管理總述

硬件講了 sram sdram ddr3
驅動講了 控制器初始化  讀寫內存

內存管理2.0主要講軟件對內存的管理(分塊及保護及管理)
關於內存管理2.0,其實也講了一部分,對內存的分段應該就屬於內存2.0// .code .ro-data .data .bss .stack .heap

現在要講 內存保護(MPU MMU) buddy slab 

內存管理流程

  • 加載文件到內存
剛加載到內存,還沒運行代碼的時候,最多隻有.code .ro-data .data
而 .bss .stack .heap 是代碼建立起來的.
  • .bss .stack .heap的建立

  • 更復雜的內存管理
// 涉及到系統,所以接下來要以 rtos 或者linux源碼爲 參考 講述內存管理
內存管理的主要功能有:內存分配、內存保護、地址映射和內存擴充。

對內存的管理的日益增長的需求及解決方案

  • 裸機程序
只有 .code .ro-data .data .bss .stack .heap 不能滿足嗎?
一開始是裸機程序,安排好這些就夠了.
  • rtos
需要多道程序併發運行,這就需要內存方面有改善
內存分配:爲每道程序分配內存。
	需要OS支持,並給每個程序的程序內存空間做分塊.
	每一個程序對應一個task_struct結構體,該結構體中一個成員類似 linux內核中的task_struct中的mm成員,指向進程所管理的內存的一個總的抽象的數據結構mm_struct
內存保護:確保每道用戶程序都只在自己的內存空間運行,彼此互不干擾。
	MPU的支持
	用系統控制處理器(CP15)寄存器來完全定義保護區域
		基於區域,不是基於頁面,控制顆粒度要比VMSA少
	不支持虛擬到物理地址的映射
		物理內存地址始終與ARM處理器生成的虛擬地址相同
  • linux

地址映射:將地址空間的邏輯地址轉換爲內存空間與對應的物理地址。
	MMU的支持
	用翻譯表來定義保護頁面
		基於頁面,不是基於區域,控制顆粒度要比PMSA多(MMU允許對內存系統進行細粒度控制)
		翻譯表存儲在內存中,然後常用的部分被加載到TLB(TLB通過緩存轉換表遍歷的結果來降低內存訪問的平均成本。)
		執行完整翻譯表查找的過程稱爲 translation table walk,它由硬件自動執行,並且在執行時間上有很大的開銷,至少有一個主內存訪問,通常有兩個
	支持虛擬到物理地址的映射
		由ARM®處理器生成的地址稱爲虛擬地址
		MMU允許將此地址映射到不同的物理地址。此物理地址標識正在訪問的主內存位置。
				
內存擴充:用於實現請求調用功能,置換功能等。
	就是內存不夠的時候,將不常用的內存數據A 放到flash的文件B裏面,然後釋放這些不常用的內存A.可使用內存就會增加. 在使用這些不常用內存A的時候,再加載B到內存.
	// 如果flash夠快的話,這就相等於將flash當內存用.同樣,也有拿內存當flash 用的,例如ramfs
	// 一般文件系統是管理flash的,同樣我們也可以將一塊內存做成一種文件系統ramfs(基於內存的文件系統),此時讀寫ramfs 文件裏面的數據,其實是在操作內存,缺點是掉電就沒了.
	https://blog.csdn.net/No1_tiger/article/details/75126974
	https://blog.csdn.net/u012489236/article/details/104172649
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章