- 什么是 MMU , MMU的作用?
- 什么是页帧,页,页表,区,他们之间的关系又是怎样的 ?
- 什么是页的高速缓存
- 地址线, 寻址, cpu 和 各级高速缓存的关系, cpu , 各级高速缓存 , 内存的关系
kernel 中 关于物理页的描述MMU (manage mem unit ) 将虚拟内存地址映射转换为 物理地址的硬件
思考为什么,需要这个硬件, 软件实现不行吗,等我叙述到最后,在做回答;
struct page{
unsigned long flags ; // 代表的该页的状态 每一个bit位代表一种状态 总共32bit,所以做多表示32 状态
// 代表页的使用次数,原子操作数 __count < 0 未被使用 =0 表示页现在空闲 一般使用 page_count(struct page* ptr),来查看页的状态
atomic_t __count;
atomic_t _mapcount; //同上,实际上就是页被映射的次数
unsigned long private; //该页的私有数据
pgoffset_t index;
struct address_space *mapping; // 页的地址映射空间
void* virtual; //页的虚拟地址
struct list_head* lru;
};
Kernel 中 区的概念 (Zone)此结构只与物理页相关, 与虚拟页无关
计算该数据结构按照32 位系统 4字节的内存对齐 计算描述一个页需要 40 字节; 假设物理页为 4 kb 大小 ;
而一个页为4KB
4gb 内存 4*1024*1024 /4 = 1024* 1024 个页面
40*1024*1024 / 1024 = 40*1024 kb = 40mb
所以一个4gb 内存页的表述结构占用40mb 但是 40Mb <<< 4GB 所以这种描述消耗很小 , 对4GB的内存来说几乎可以忽略不计
- 为甚么要这设置区的概念
-
- 有些内存页只能在特定的硬件地址上进行使用(将硬件的IO 空间 映射到 内存空间 ARM 架构中经常用到)
-
- 根据前人总结,一些硬件只能用某些特定的内存地址来执行DMA(直接内存访问)
-
- 前人还总结了, 一些体系结构下虚拟地址范围 要 小于 物理地址范围,那尴尬的事情发生了,用于永远无法完成完整的物理内存映射(大于的情况下就没有任何问题)
-
- 所以常见的4中分区
- ZONE_DMA 这个物理页可以用来进行DMA 的擦操作
- ZONE_DMA32 同上,但是只能被寻址能力32位的设备进行使用
- ZONE_NORMAL 正常区域
- ZONE_HIGHM 高端内存区域, 其中的页就不能永久的映射到内核地址空间 > 896MB 的物理内存 32位的操作系统上
linux的页划分为区,形成不同的内存池
注解:
内存管理中最重要的就是理解这样做的目的是什么
大家可以思考档案柜的作用和图书馆图书查找图书的方式(内核中的问题都很抽象,需要自己理解具象化)
所以分页,分区,和分不同的功能区是必然的选择,我查找的资料比较老,依据的是2.6.x 的内核版本, 所以这涉及到了 slab 缓存层,没有 slub 缓存的方式,和 slab 的缓存的方式
总结一点就是,所有查找的资料都是抽象的概念, 不会有太多具象化的解释,理解到这种设计方式,就真的是因人而异了



