Linux内存系统讲解

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我们先来看下Linux内存布局,此图比我之前写的那篇文章写的布局更详细。

在linux中,每一个进程都被抽象为task_struct结构体,称为进程描述符,存储着进程。

各方面的信息;例如打开的文件,信号以及内存等等;然后task_struct 的一个属性mm_struct管理着进程的所有虚拟内存,称为内存描述符。在

mm_struct结构体中,存储着进程各个内存段的开始以及结尾,如上图所示;这个进程使用的物理内存,即常驻内存RSS页数,这个内存使用的虚拟地址空间VSZ页数,还有这个进程虚拟内存区域集合和页表。

从上面这个图可以看出,进程是有代码段Text segment,数据段(已初始化的全局,静态变量),BSS段(未初始化的全局,静态变量),堆,内存映射区以及栈。

Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍Linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,Linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。

从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。

每一块虚拟内存区(VMA)都是由一块连续的虚拟地址组成,这些地址从不覆盖。一个vm_area_struct实例描述了一块内存区域,包括这块内存区域的开始以及结尾地址;flags标志决定了这块内存的访问权限和行为;vm_file决定这块内存是由哪个文件映射的,如果没有文件映射,则这块内存为匿名的(anonymous)。上述图中提到的每个内存段,都对应于一个vm_area_struct结构。如下图所示

上图即为/bin/gonzo进程的内存布局。程序的二进制文件映射到代码段和

数据段,代码段为只读只执行,不可更改;全局以及静态的未初始化的变量映

射到BSS段,为匿名映射,堆和栈也是匿名映射,因为没有相应的文件映射;

内存映射区可以映射共享库,映射文件以及匿名映射,所以这块内存段可以是

文件映射也可以是匿名映射。而且不同的文件,映射到不同的vm_area_struct 区。

这些vm_area_struct集合存储在mm_struct中的一个单向链表和红黑树中;当输出/proc/pid/maps文件时,只需要遍历这个链表即可。红黑树主要是为了

快速定位到某一个内存块,红黑树的根存储在mm_rb域。

一、走进Linux 内存

1、内存是什么?

1)内存又称主存,是CPU 能直接寻址的存储空间,由半导体器件制成

2)内存的特点是存取速率快

虚拟内存是不存储任何数据的,它只是将地址空间映射到物理内存。物理

内存有内核伙伴系统分配,如果一块物理内存没有被映射,就可以被伙伴系统

分配给虚拟内存。刚分配的物理内存叶框可能是匿名的,存储进程数据,也可

能是也缓存,存储文件或块设备的数据。一块虚拟内存vm_area_struct块是由连续的虚拟内存页组成的,而这些虚拟内存块映射的物理内存却不一定连续,

如下图所示:

如上图所示,有三个页映射到物理内存,还有两个页没有映射,所以常驻内存RSS为12kb,而虚拟内存大小为20kb。对于有映射到物理内存的三个页的页表项PTE的Present标志设为1,而两个没有映射物理内存的虚拟内存页表项的Present位清除。所以这时访问那两块内存,则会导致异常缺页。

2、内存的作用

•1)暂时存放 cpu 的运算数据

•2)硬盘等外部存储器交换的数据

•3)保障 cpu 计算的稳定性和高性能

二、 Linux 内存地址空间

1、Linux 内存地址空间 Linux 内存管理全貌

1,内核给每个进程提供一个独立的虚拟机地址空间,并且这个地址空间是连续的

2,虚拟地址空间内部又被分为内核空间和用户空间

3,32位和64位系统的虚拟地址空间

32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间。

而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。

4,进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存

5,只有实际使用的虚拟内存才会被分配物理内存,通过内存映射来管理

6,内存映射,就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每个进程都维护了一张表,记录虚拟地址与物理地址的映射关系

2、内存地址——用户态&内核态

•用户态:Ring3 运行于用户态的代码则要受到处理器的诸多

•内核态:Ring0 在处理器的存储保护中,核心态

•用户态切换到内核态的 3 种方式:系统调用、异常、外设中断

•区别:每个进程都有完全属于自己的,独立的,不被干扰的内存空间;用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用;内核态线程共享内核地址空间;

3、内存地址——MMU 地址转换

•MMU 是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件

•分段机制把一个逻辑地址转换为线性地址

•分页机制把一个线性地址转换为物理地址

4、内存地址——分段机制

1) 段选择符

•为了方便快速检索段选择符,处理器提供了 6 个分段寄存器来缓存段选择符,它们是:cs,ss,ds,es,fs 和 gs

•段的基地址(Base Address):在线性地址空间中段的起始地址

•段的界限(Limit):在虚拟地址空间中,段内可以使用的最大偏移量

2) 分段实现

•逻辑地址的段寄存器中的值提供段描述符,然后从段描述符中得到段基址和段界限,然后加上逻辑地址的偏移量,就得到了线性地址

5、内存地址——分页机制(32 位)

•分页机制是在分段机制之后进行的,它进一步将线性地址转换为物理地址•10 位页目录,10 位页表项,12 位页偏移地址

•单页的大小为 4KB

相关文档
最新文档