一、内存管理
1.1 内存管理的出现
- 早期的计算机,程序是直接运行在物理内存上。也就是程序在运行的过程中,直接访问的是物理地址。
- 如果这个系统只运行一个程序,只要这个程序所需的内存不要超过该机器的物理内存就不会出现问题,也就不需要考虑内存管理,反正就一个程序,就这么点内存,够不够用就是自己的事了。
- 现在的系统都是支持多任务,多进程的,这样CPU以及其他硬件的利用率会更高。这个时候就要考虑到将系统内有限的物理内存如何及时有效的分配给多个程序了,这个事情就称之为内存管理。
1.2 内存管理的用途
内存管理是Linux内核通过软硬件协作来管理内存的分配及回收的一种方法。
在Linux系统上电自检(POST,Power-On-Self-Test)阶段使用临时内存,而系统启动后,正常运行阶段的内存使用又有两大类:
(1)固定的内存分配,是永久的不变的,主要给内核代码及数据使用;
(2)动态内存分配,主要源于进程的创建和空间的扩张。本文主要针对操作系统正常运行时对动态内存的管理。
1.2.1 虚拟内存和物理内存的定义
1.2.1.1 什么是虚拟内存?
-
虚拟内存是操作系统发展史上一个重要的里程碑,虚拟内存的使用,避免程序直接和主存(物理内存)打交道,并且对缓存、主存和磁盘做了统一抽象,这样程序就可以突破物理内存的大小限制,当然程序还是要受制于虚拟内存的大小限制的。
-
程序中看到的内存地址是虚拟内存地址,程序读写内存时会被映射到实际的物理内存中,这个映射工作是由MMU(内存管理单元)来完成,MMU接收CPU发出的虚拟地址,将其转换为物理地址后,发送给内存,内存按照该物理地址进行相应访问后读出或写入相关数据。
1.2.2 虚拟内存的划分:用户空间与内核空间
从Linux操作系统层次上,可将Linux虚拟内存划分为: 用户空间内存和内核空间内存。
虚拟内存的大小取决于处理器体系结构的字长。32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致。因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。每个进程的用户空间都是完全独立、互不相干的。Linux 内核采用了最简单的映射方式来映射物理内存,即把物理地址+PAGE_OFFSET按照线性关系直接映射到内核空间。PAGE_OFFSET大小为 0xC0000000 (=3G)。但是Linux内核并没有把整个1G空间用于线性映射,而只映射了最多896M物理内存,预留了最高端的128M虚拟地址空间给IO设备和其他用途。
1.3 操作系统和MMU
实际上MMU是为满足操作系统越来越复杂的内存管理而产生的。
1.3.1 OS和MMU的关系
- 系统初始化代码会在内存中生成页表,然后把页表地址设置给MMU对应寄存器,使MMU知道页表在物理内存中的什么位置,以便在需要时进行查找。之后通过专用指令启动MMU,以此为分界,之后程序中所有内存地址都变成虚地址,MMU硬件开始自动完成查表和虚实地址转换。
- OS初始化后期,创建第一个用户进程,这个过程中也需要创建页表,把其地址赋给进程结构体中某指针成员变量。即每个进程都要有独立的页表。
- 用户创建新进程时,子进程拷贝一份父进程的页表,之后随着程序运行,页表内容逐渐更新变化。
1.3.2 虚拟地址到物理地址的映射流程
VA到PA的映射过程:MMU得到VA后先在TLB内查找,若没找到匹配的PTE条目就到外部页表查询,并置换进TLB;根据PTE条目中对访问权限的限定检查该条VA指令是否符合,若不符合则不继续,并抛出exception异常;符合后根据VA的地址分段查询页表,保持offset(广义)不变,组合出物理地址,发送出去。
在这个过程中,软件的工作核心就是生成和配置页表。
1.4 物理内存管理基础概念
Linux为了用统一的代码获得最大的兼容性,引入了以下物理内存管理概念:文章来源:https://www.toymoban.com/news/detail-673105.html
- 物理内存结点(node)
- 物理内存区域(Zone)
- 物理内存页框(page Frame)
只有年轻的将士才会悔恨过去,熟练的将军都是在深夜里擦亮剑,准备下一场战斗。文章来源地址https://www.toymoban.com/news/detail-673105.html
到了这里,关于内存管理框架 --- 基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!