内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。
虚拟地址的作用
如果用户进程直接操作物理地址会有以下的坏处:
1、 用户进程可以直接操作内核对应的内存,破坏内核运行。
2、 用户进程也会破坏其他进程的运行
CPU 中寄存器中存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。
通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。
当进程申请内存的时候,会为其分配逻辑地址和物理地址,并将逻辑地址和物理地址做一个映射。
所以,Linux内存管理涉及到了以下三个部分:
1、物理内存
物理内存的组织
Linux 中内存分为 3 个级别,从下到上依次为:
1、Page: 一个 page 的大小为 4k, Page 是内存的一个最基本的单位。
2、Zone: Zone 中提供了多个队列来管理 page。
Zone分为 3 种
2.1、 ZONE_DMA:用来存放 DMA 读取 IO 设备的数据,内核专用
2.2、 ZONE_NORMAL:用来存放内核的相关数据,内核专用
2.3、 ZONE_HIGHM