Kernel Exploring
  • 前言
  • 支持
  • 老司机带你探索内核编译系统
    • 编译出你的第一个内核
    • 内核编译中的小目标
    • 可能是kbuild中最直接的小目标 – help
    • 使用了一个kbuild函数的目标 – cscope
    • 内核中单个.o文件的编译过程
    • 根目录vmlinux的编译过程
    • 启动镜像bzImage的前世今生
    • setup.bin的诞生记
    • 真假vmlinux–由vmlinux.bin揭开的秘密
    • bzImage的全貌
    • kbuild系统浅析
  • 启动时的小秘密
    • INIT_CALLS的秘密
    • 内核参数
  • 内核加载全流程
    • bootloader如何加载bzImage
    • 内核压缩与解压
    • 内核加载的几个阶段
    • 保护模式内核代码赏析
  • 内存管理
    • 内核页表成长记
      • 未解压时的内核页表
      • 内核早期的页表
      • cleanup_highmap之后的页表
      • 映射完整物理地址
      • 启用init_level4_pgt
    • 自底而上话内存
      • e820从硬件获取内存分布
      • 原始内存分配器--memblock
      • 页分配器
        • 寻找页结构体的位置
        • 眼花的页结构体
        • Node-Zone-Page
        • 传说的伙伴系统
        • Compound Page
        • GFP的功效
        • 页分配器的用户们
      • slub分配器
        • slub的理念
        • 图解slub
      • 内存管理的不同粒度
      • 挑战和进化
        • 扩展性的设计和实现
        • 减少竞争 per_cpu_pageset
        • 海量内存
        • 延迟初始化
        • 内存热插拔
        • 连续内存分配器
    • 虚拟内存空间
      • 页表和缺页中断
      • 虚拟地址空间的管家--vma
      • 匿名反向映射的前世今生
      • 图解匿名反向映射
      • THP和mapcount之间的恩恩怨怨
      • 透明大页的玄机
      • NUMA策略
      • numa balance
      • 老版vma
    • 内存的回收再利用
      • 水线
      • Big Picture
      • 手动触发回收
      • Page Fram Reclaim Algorithm
      • swapfile原理使用和演进
    • 内存隔离
      • memcg初始化
      • 限制memcg大小
      • 对memcg记账
    • 通用
      • 常用全局变量
      • 常用转换
    • 测试
      • 功能测试
      • 性能测试
  • 中断和异常
    • 从IDT开始
    • 中断?异常?有什么区别
    • 系统调用的实现
    • 异常向量表的设置
    • 中断向量和中断函数
    • APIC
    • 时钟中断
    • 软中断
    • 中断、软中断、抢占和多处理器
  • 设备模型
    • 总线
    • 驱动
    • 设备
    • 绑定
  • nvdimm初探
    • 使用手册
    • 上帝视角
    • nvdimm_bus
    • nvdimm
    • nd_region
    • nd_namespace_X
    • nd_dax
      • dev_dax
  • KVM
    • 内存虚拟化
      • Qemu内存模型
      • KVM内存管理
  • cgroup
    • 使用cgroup控制进程cpu和内存
    • cgroup文件系统
    • cgroup层次结构
    • cgroup和进程的关联
    • cgroup数据统计
  • 同步机制
    • 内存屏障
    • RCU
  • Trace/Profie/Debug
    • ftrace的使用
    • 探秘ftrace
    • 内核热补丁的黑科技
    • eBPF初探
    • TraceEvent
    • Drgn
  • 内核中的数据结构
    • 双链表
    • 优先级队列
    • 哈希表
    • xarray
    • B树
    • Maple Tree
    • Interval Tree
  • Tools
  • Good To Read
    • 内核自带文档
    • 内存相关
    • 下载社区邮件
Powered by GitBook
On this page
  • 页表
  • vma
  • 反向映射
  • THP
  • NUMA策略
  1. 内存管理

虚拟内存空间

Previous连续内存分配器Next页表和缺页中断

Last updated 5 months ago

终于又要开新的一章了,这次我们来聊聊内存相关但又相对独立的一块 -- 虚拟内存空间。

从我现在的角度去看,内核中的内存管理可以分成两个重要的部分:

  • 物理内存分配回收

  • 虚拟内存空间管理

其中第一部分在一章中做了描述,第二部分将在这章展开。

其实这两部分并不是完全分割的,而是你中有我,我中有你。只是在一定层次上看,第一部分的内容已经相对完整可以自成一个体系了。

虽然在本章中将紧密得引用第一部分的内容,尤其是struct page,但是我们还是可以尽量将本章分成一下几个部分来描述。

  • 页表

  • vma

  • 反向映射

  • THP

页表

可以说虚拟内存空间的物理根本就是页表了,所以开篇的头一个小节我们来看看页表的样子,以及页表构造和释放的过程。

vma

除了有硬件上的页表做虚拟空间的映射,在软件上也有对应的数据结构来区分虚拟地址空间的属性,而这个数据结构就是:

反向映射

反向映射是用来搜索对于某一个内存页,都有哪些进程在使用。其中分成了匿名页和文件页。

看了上文后,大家一定对反向映射有了概念性的认识。但是你一定想不到在学习反向映射的过程中有一个非常繁琐的内容 -- mapcount。

THP

透明大页(THP)是一种能够加速页表查询的方法。很有意思,在这里简要说一下我的理解。

NUMA策略

当系统中存在多个numa节点时,内存从哪个numa节点上分配就变得有些重要了。因为这会影响到系统运行的性能。

PS: 在引入maple tree之前的

反向映射的架构也是经历了一番周折才定型为现在的样子。首先我们来说说

了解了历史后,我们深入学习一下现状

从概念上看这个值的含义是表示当前页映射到页表的个数,案例是比较好理解的。但是当这个数遇到了透明大页(THP)后就产生了各种纠缠不清的恩恩怨怨。在文章中,我将给大家尝试理清楚这中间的是是非非。

内核中为了应对这个问题,提出了

同时为了保持进程迁移过程中内存策略的一致,内核还提供了。

自底而上话内存
页表和缺页中断
虚拟地址空间的管家--vma
版本
匿名反向映射的前世今生
图解匿名反向映射
THP和mapcount之间的恩恩怨怨
透明大页的玄机
NUMA策略
numa balance