硬件讲了 sram sdram ddr3
驱动讲了 控制器初始化 读写内存
内存管理2.0主要讲软件对内存的管理(分块及保护及管理)
关于内存管理2.0,其实也讲了一部分,对内存的分段应该就属于内存2.0的
现在要讲 内存保护(MPU MMU) buddy slab
内存管理流程
刚加载到内存,还没运行代码的时候,最多只有.code .ro-data .data
而 .bss .stack .heap 是代码建立起来的.
一般是开始运行的用户代码建立的
对于用户程序是start.S中的_start
对于arm-linux是arch/arm/kernel/head.S 中的 stext
内存管理的主要功能有:内存分配、内存保护、地址映射和内存扩充。
我们怎么看到一个系统,一个操作系统包括
1. 操作系统内核
2. 应用程序A
3. 应用程序B
对内存的管理的日益增长的需求及解决方案
只有 .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