Linux——内存管理代码分析

虚空间管理

页框和页的关系

页框

将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框,也叫页帧,即物理页面,是linux划分内存空间的结果。
每个页框都有一个页框号,即内存块号、物理块号。

将用户进程的地址空间也分为与页框大小相等的一个个区域,称为页或页面,即虚拟页面,是linux划分地址空间的结果。
每个页面都有一个页号

页、页表项、页表、页目录项、页目录的关系参考:
计算机体系结构——虚拟内存技术

CSDN:基本分页存储管理的基本概念

线性区

当用户态进程动态请求内存时,linux并不会直接分配物理页框,而是先分配一段新的虚拟地址空间的使用权。

CSDN:进程地址空间 - VMA线性区

PCB中内存信息数据结构

主要的数据结构

mm_struct

mm是进程控制块中的一个成员,表示了该进程的内存信息。
每个进程都有自己的页目录、页表项等信息
在这里插入图片描述
在这里插入图片描述

*pgd: 一级页表的起始地址
*mmap:指向进程的第一个VMA
mm_rb:指向红黑树的根

vm_area_struct

线性区,表示用户虚空间中的一块连续区域,可以简称为vma。
数据结构成员包括权限信息等。
vm_rb->rb_left指针指向相邻的低地址VMA,vm_rb->rb_right指向相邻的高地址VMA1
在这里插入图片描述

page

页框描述符,描述了页框的类型(匿名页还是文件页)
在这里插入图片描述
mem_map:描述了所有页框,连续存放。

file

页高速缓存,以文件为管理单位:缓存的页框属于某个文件
硬盘数据页的高速缓存,放在页框中;

在这里插入图片描述
在这里插入图片描述

address_space

address_space:记录映射到本文件(某一区间)的所有线性区,这些线性区按其区间组织为一颗优先搜索树。
在这里插入图片描述
page_tree:文件的所有缓存页框的描述符构成一颗基树,该结构体表示基树的根节点,如果最低位为1,表示指向的是一个radix_tree_node对象

anon_vma

anon_vma数据结构,链接了page和anon_vma,实质上和anon_vma_chain共同链接了的page数据结构和VMA的vm_area_struct数据结构
在这里插入图片描述

anon_vma_chain

anon_vma_chain链接了anon_vma和vma
在这里插入图片描述

rb_node 和 rb_root

在这里插入图片描述

radix_tree_node

path:该节点的页节点数
count:表示有效页框描述符地址的数量
在这里插入图片描述

数据结构关系

数据结构关系图:
在这里插入图片描述

链表关系

所有的page构成一颗基树
在这里插入图片描述

页框描述符红黑树
通过page->index可以快速找到其他page地址
在这里插入图片描述

vma红黑树
所以进程的VMAs组成一个双向链表

反向映射

正向映射:页号 → 页框号,即通过虚拟页号查找物理页号
反向映射:页框号 → 进程号和页号的集合,即在已知物理页面(page frame)的情况下,找到映射该物理页面的虚拟页。

反向映射使用场景

反向映射通常在页框回收时需要此功能,例如

  1. 当内存空间不足时,有些页面长时间不适用,需要交换到磁盘
  2. 有些页面需要迁移

工作原理

当上述使用场景需要反向映射时,linux为了快速定位映射到该物理页的页表项,通过页框号查找页框描述符,通过页框描述符中的mapping确定是匿名页还是文件页,并根据mapping的值

t

父进程为自己的进程空间VMA分配物理页面的时,会产生匿名页面

匿名页和文件页

二者均是页框的类型。

匿名页

不属于文件的页高速缓存,没有关联到文件页,不是以文件形式存在,无法和磁盘文件交换
匿名页面是线性区的一种类型,映射到anon_vma对象(该对象关联了进程为对应线性区申请的一组匿名页框,并记录了使用这些页框的所有线性区)
mapping的最低位为1.

匿名页反向映射结构图2
在这里插入图片描述

文件页

映射文件的页,即某个文件的也高速缓存。程序可以通过read/write/mmap去操作,此时在内存中会申请page cache来缓存硬盘内容,因此该内容及存在于内存,也存在于外存中
属于某个address_space对象(该对象记录使用该文件页高速缓存的所有线性区)
mapping!=0,但mapping的最低位为0。

文件页反向映射结构图2
在这里插入图片描述

linux内存管理笔记(三十四)----匿名映射

参考文献


  1. 红黑树的应用:Linux内核虚拟内存的管理 ↩︎

  2. CSDN:linux内存管理笔记(三十八)----反向映射 ↩︎ ↩︎

相关推荐

  1. Linux 内核源码分析内存管理——Slab 分配器

    2024-06-07 02:46:03       48 阅读
  2. linux内存管理

    2024-06-07 02:46:03       28 阅读
  3. 深入理解Linux 内核 内存管理(上)

    2024-06-07 02:46:03       24 阅读
  4. linux内存泄漏分析

    2024-06-07 02:46:03       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 02:46:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 02:46:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 02:46:03       82 阅读
  4. Python语言-面向对象

    2024-06-07 02:46:03       91 阅读

热门阅读

  1. 力扣2156.查找给定哈希值的子串

    2024-06-07 02:46:03       32 阅读
  2. 策略模式结合Spring使用

    2024-06-07 02:46:03       25 阅读
  3. Scala编程基础4 类、对象、继承、特质

    2024-06-07 02:46:03       28 阅读
  4. [React]用 flushSync 同步更新 state

    2024-06-07 02:46:03       31 阅读
  5. Sass 详解

    2024-06-07 02:46:03       24 阅读
  6. linux c socket编程里SO_REUSEADDR的作用

    2024-06-07 02:46:03       31 阅读
  7. 【安卓基础】-- 消息机制 Handler

    2024-06-07 02:46:03       30 阅读
  8. lm studio 0.2.24国内下载模型

    2024-06-07 02:46:03       30 阅读
  9. 常见代码版本管理工具

    2024-06-07 02:46:03       32 阅读
  10. Android WebView升级

    2024-06-07 02:46:03       22 阅读
  11. 判断素数/质数

    2024-06-07 02:46:03       29 阅读
  12. Loguru,一个 Python 日志神器

    2024-06-07 02:46:03       31 阅读