linux内核内存管理
Linux内核的内存管理与漏洞利用案例分析
本文主要介绍Buddy System、Slab Allocator的实现机制以及现实中的一些漏洞利用方法,从攻击者角度加深对Linux内核内存管理机制的理解。前言网上已经有很多关于Linux内核内存管理的分析和介绍了,但是不影响我再写一篇:) 一方面是作为其他文章的补充,另一方面则自己学习的记录、总结和沉淀。所谓条条大路通罗马,本文只作为其中一条路,强烈建议想去罗马的朋友看完文末所列举的参考文章。
日期 2023-06-12 10:48:40【Linux 内核】Linux 内核源码几个重要的入口源文件及函数介绍 ( 系统初始化 | 内存管理 | 虚拟文件系统 | 网络管理 )
文章目录一、系统初始化二、内存管理三、虚拟文件系统四、网络管理一、系统初始化系统初始化 的入口源码是 " linux-5.6.18\init\ " 目录下的 main.c 源文件 ;二、内存管理内存管理 的源码在 " linux-5.6.18\mm\ " 目录下 ;内存管理模块源码中 , 核心类是 " linux-5.6.18\mm\memory.
日期 2023-06-12 10:48:40【Linux 内核 内存管理】RCU 机制 ③ ( RCU 模式下添加链表项 list_add_rcu 函数 | RCU 模式下删除链表项 list_del_rcu 函数 )
文章目录一、RCU 模式下添加链表项 list_add_rcu 函数二、RCU 模式下删除链表项 list_del_rcu 函数一、RCU 模式下添加链表项 list_add_rcu 函数在 Linux 源码 linux-5.6.18\include\linux\rculist.h 头文件中定义的就是 RCU 链表的操作 ,其中定义的static inline void list_add_rcu(
日期 2023-06-12 10:48:40【Linux 内核 内存管理】RCU 机制 ⑤ ( RCU 层次架构概念 | RCU 层次架构源码解析 | RCU 层次架构每层最多叶子数 | RCU 层次架构每个叶子 CPU 数量 )
文章目录一、RCU 层次架构概念及源码二、RCU 层次架构源码解析1、RCU 层次架构每层最多叶子数2、RCU 层次架构每个叶子 CPU 数量一、RCU 层次架构概念及源码RCU 机制 中 , 会 根据 CPU 数量 , 按照 " 树形结构 “ 组成 RCU 层次架构 , 称为 ” RCU Hierarchy " ;在 Linux 源码 linux-5.6.18\include
日期 2023-06-12 10:48:40【Linux 内核 内存管理】优化内存屏障 ① ( barrier 优化屏障 | 编译器优化 | CPU 执行优化 | 优化屏障源码 barrier 宏 )
文章目录一、优化屏障 ( 编译器优化 | CPU 执行优化 )二、优化屏障源码一、优化屏障 ( 编译器优化 | CPU 执行优化 )" 代码 “ 编译成 ” 可执行文件 “ , 执行该 可执行文件 时 , 二进制指令 的 ” 执行顺序 " , 与 源码 的指令顺序 并不是完全一致的 , 为了提高 " 可执行文件 " 的执行性能 , 会对程序中的 "
日期 2023-06-12 10:48:40【Linux 内核 内存管理】优化内存屏障 ④ ( 处理器内存屏障 | 八种处理器内存屏障 | 通用内存屏障 | 写内存屏障 | 读内存屏障 | 数据依赖屏障 | 强制性内存屏障 |SMP内存屏障 )
文章目录一、处理器内存屏障二、Linux 内核处理器内存屏障一、处理器内存屏障" 处理器内存屏障 “ 针对 ” CPU " 之间的内存访问乱序 和 CPU 访问外设乱序 问题 ;为了 提高 " 流水线 " 性能 , 新式处理器可以采用 " 超标量 体系结构 “ 和 ” 乱序执行 " 技术 , 可以在 一个时钟周期 中 并行执行多条指令 ;
日期 2023-06-12 10:48:40【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )
文章目录一、ARM64 架构体系内存分布二、Linux 内核启动源码 start_kernel三、内存初始化源码 mm_init四、内存初始化源码 mem_init一、ARM64 架构体系内存分布ARM64 架构 的 " 物理地址 " 有 48 位 , 理论上最大 " 寻址空间 " 为 256 TB ;ARM64 架构 的 " 虚拟地址 "
日期 2023-06-12 10:48:40【Linux 内核 内存管理】Linux 内核堆内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 | brk 系统调用源码介绍 )
文章目录一、Linux 系统 动态分配堆内存 方式二、brk 系统调用 动态分配堆内存一、Linux 系统 动态分配堆内存 方式Linux 系统中 , 提供了 2 种方式 进行 " 动态分配堆内存 " 操作 ;① brk 系统调用 : 该方式本质是 设置 " 进程数据段 “ 的 结束地址 , 将该 ” 结束地址 " 向 高或低 移动 , 实现堆内存的 扩张或
日期 2023-06-12 10:48:40【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 )
文章目录一、sbrk 内存分配系统调用代码示例二、在 /proc/pid/maps 中查看进程堆内存详情本篇博客调用 sbrk 系统调用函数 , 申请并修改 堆内存 , 并在 /proc/pid/maps 中查看该进程的 堆内存 ;一、sbrk 内存分配系统调用代码示例sbrk 系统调用函数 , 作用是 修改程序 BSS 段大小 ;函数原型如下 :#include <unistd.h>
日期 2023-06-12 10:48:40【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )
文章目录一、mm_struct 结构体成员分析1、mmap 成员2、mm_rb 成员3、get_unmapped_area 函数指针4、task_size 成员5、pgd 成员6、mm_users 成员7、mm_count 成员一、mm_struct 结构体成员分析mm_struct 结构体 在 Linux 源码 linux-4.12\include\linux\mm_types.h#359 位置
日期 2023-06-12 10:48:40【Linux 内核 内存管理】内存映射相关数据结构 ② ( vm_area_struct 结构体成员分析 | vm_mm 成员 | vm_page_prot 成员 | vm_flags 成员 )
文章目录一、vm_area_struct 结构体成员分析1、vm_mm 成员2、vm_page_prot 成员3、vm_flags 成员二、vm_area_struct 结构体完整源码在之前的博客 【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( vm_area_struct 结构体成员分析 | vm_start | vm_end | vm_next | vm_prev |vm_rb)
日期 2023-06-12 10:48:40【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )
文章目录一、vm_area_struct 结构体成员分析1、shared 成员2、anon_vma_chain 成员3、anon_vma 成员二、vm_area_struct 结构体完整源码在博客 【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( vm_area_struct 结构体成员分析 | vm_start | vm_end | vm_next | vm_prev |vm_rb)
日期 2023-06-12 10:48:40【Linux 内核 内存管理】内存映射相关数据结构 ④ ( vm_area_struct 结构体成员分析 | vm_ops 成员 | vm_operations_struct 结构体成员分析 )
文章目录一、vm_area_struct 结构体成员分析1、vm_ops 成员二、vm_operations_struct 结构体成员分析1、open 函数指针2、close 函数指针3、mremap 函数指针4、fault 函数指针5、huge_fault 函数指针6、map_pages 函数指针7、page_mkwrite 函数指针三、vm_area_struct 结构体完整源码四、vm_op
日期 2023-06-12 10:48:40【Linux 内核 内存管理】内存管理系统调用 ③ ( mmap 创建内存映射原理 | 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 并分配物理内存页 | mmap 库函数与内核系统调用函数 )
文章目录一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 )1、分配虚拟内存页2、物理地址与虚拟地址进行映射3、产生缺页异常并分配物理内存页二、mmap 库函数与 mmap 内核系统调用函数一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 )1、分配虚拟内存页分配
日期 2023-06-12 10:48:40【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )
文章目录一、进程一描述二、进程二描述三、mmap 进程共享内存展示一、进程一描述在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 ,在该进程中 , 创建并打开文件 , 为该文件设置大小 ,使用 mmap 创建 " 文件映射 " , 并通过直接访问内存的方
日期 2023-06-12 10:48:40【Linux 内核 内存管理】mmap 系统调用源码分析 ⑤ ( mmap_region 函数执行流程 | mmap_region 函数源码 )
文章目录一、mmap_region 函数执行流程1、检查内存申请是否合法2、创建 " 虚拟内存区域 "二、mmap_region 函数源码调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构 | 内存节点描述 | 内存节点 pglist_data 结构体 | pglist_data 结构体源码 )
文章目录一、内存节点描述二、内存节点 pglist_data 结构体三、pglist_data 结构体源码内存管理系统 3级结构 :① 节点 Node ,② 区域 Zone ,③ 页 Page ,Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 " ;一、内存节点描述Linux 内核中 , 内存节点 ( Node ) 是 " 内存管理 &q
日期 2023-06-12 10:48:40【Linux 内核 内存管理】memblock 分配器 ① ( memblock 分配器简介 | memblock 结构体成员分析 | 物理内存类型 与 内存类型 )
文章目录一、memblock 分配器二、memblock 结构体分析1、bottom_up 成员2、current_limit 成员3、memory 成员4、reserved 成员5、physmem 成员三、物理内存类型 与 内存类型ARM64 架构体系中 , 不能使用 bootmem 引导内存分配器 , 使用的是 memblock 分配器 ;一、memblock 分配器memblock 分配器
日期 2023-06-12 10:48:40【Linux 内核 内存管理】memblock 分配器 ② ( memblock_type 内存块类型 | memblock_type 结构体成员分析 )
文章目录一、memblock_type 内存块类型二、memblock_type 结构体成员分析1、cnt 成员2、max 成员3、total_size 成员4、regions 成员5、name 成员一、memblock_type 内存块类型memblock 分配器 涉及到 内存块 类型 , 在 Linux 内核中 , 使用 struct memblock_type 结构体 描述 ,struct
日期 2023-06-12 10:48:40【Linux 内核 内存管理】分区伙伴分配器 ① ( 分区伙伴分配器源码数据结构 | free_area 空闲区域数组 | MAX_ORDER 宏定义 | 空闲区域的页最大阶数 )
文章目录一、分区伙伴分配器二、分区伙伴分配器源码数据结构1、free_area 空闲区域数组2、MAX_ORDER 宏定义 ( 空闲区域的页最大阶数 )一、分区伙伴分配器在前两篇博客【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 )【Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配器分配内存流程 )中 , 讲解了 基本 伙伴分配器 概念 , 以及
日期 2023-06-12 10:48:40【Linux 内核 内存管理】分区伙伴分配器 ④ ( 备用内存区域列表排序方式 | 节点优先顺序 | 区域优先顺序 | 排序方式优缺点 | 默认排序方式 )
文章目录一、备用内存区域列表排序方式 ( 节点优先顺序 | 区域优先顺序 )二、备用内存区域列表排序方式优缺点 ( 节点优先顺序 | 区域优先顺序 )三、备用内存区域列表默认排序方式在上一篇博客 【Linux 内核 内存管理】分区伙伴分配器 ③ ( 备用内存区域列表 | ZONELIST_FALLBACK 枚举 | zoneref 结构体 | 备用内存区域借用物理页规则 ) 中 , 介绍了 UMA
日期 2023-06-12 10:48:40【Linux 内核 内存管理】分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 中的区域水线 watermark 成员 )
文章目录一、区域水线二、区域水线数据结构 zone_watermarks 枚举 ( WMARK_MIN | WMARK_LOW | WMARK_HIGH | NR_WMARK )三、内存区域 zone 中的区域水线 watermark 成员一、区域水线" 首选内存区域 “ 在特定情况下 从 ” 备用内存区域 “ 借用物理内存 , 该 " 特定情况 " 与 ” 区域水线
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理分配页 ① ( 分区伙伴分配器物理分配页核心函数 __alloc_pages_nodemask | __alloc_pages_nodemask 函数完整源码 )
文章目录一、分区伙伴分配器物理分配页核心函数 __alloc_pages_nodemask二、__alloc_pages_nodemask 函数完整源码一、分区伙伴分配器物理分配页核心函数 __alloc_pages_nodemaskLinux 内核中 , " 分区伙伴分配器 " 有多种 物理页分配函数 , 所有的 函数 都会调用 __alloc_pages_nodemask
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理分配页 ③ ( 物理页分配标志位分析 | ALLOC_WMARK_MIN | ALLOC_WMARK_MASK | ALLOC_HARDER )
文章目录一、物理页分配标志位分析1、水线相关标志位 ( ALLOC_WMARK_MIN | ALLOC_WMARK_LOW | ALLOC_WMARK_HIGH | ALLOC_NO_WATERMARKS )2、水线位源码 ( ALLOC_WMARK_MASK )3、物理页分配标志位 ( ALLOC_HARDER | ALLOC_HIGH | ALLOC_CPUSET | ALLOC_CMA )二
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )
文章目录一、获取首选内存区域二、异步回收内存页三、最低水线也分配四、直接分配内存在 【Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __alloc_pages_nodemask 函数分配物理页流程 ) 博客中 , 分析了 __alloc_pages_nodemask 函数分配物理页流程如下 :首先 , 根据 gfp_t gfp_ma
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理页释放 ( 物理页释放 __free_pages 函数 )
文章目录一、物理页释放 __free_pages 函数一、物理页释放 __free_pages 函数页分配器 提供了 释放 物理页的 函数 __free_pages , 该函数定义在 Linux 内核源码的 linux-4.12\mm\page_alloc.c#4083 位置 ;__free_pages 函数参数分析 :struct page *page 参数 表示 要释放的 物理页 page 的
日期 2023-06-12 10:48:40Exploring the Memory Management of Linux Kernel(linux内核的内存管理)
Linux kernel is the core of many popular operating systems such as Ubuntu, SuSE, RedHat and so on. Its memory management is an important part of the kernel and has a profound influence on the stabili
日期 2023-06-12 10:48:40Linux内核态内存管理探究(linux内核态内存)
Linux作为现在最为流行的操作系统,其内核实现的内存管理非常重要,每个操作系统都有不同的内存管理方法。Linux的内存管理有两个不同的模式,即内核态和用户态。本文将介绍Linux内核态内存管理的实现技术以及其机制,以便帮助读者加深对Linux内存管理的了解。 Linux内核态内存管理负责管理物理内存和虚拟内存,提供内存空间给不同的应用程序和系统来运行。它也负责在内存中分配和回收内存,以及记录
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理页释放 ( 物理页释放 __free_pages 函数 )
文章目录 一、物理页释放 __free_pages 函数 一、物理页释放 __free_pages 函数 页分配器 提供了 释放 物理页的 函数 __free_pages ,
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )
文章目录 一、retry 标号代码分析二、retry 标号完整代码 在 【Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __alloc
日期 2023-06-12 10:48:40【Linux 内核 内存管理】物理分配页 ④ ( __alloc_pages_nodemask 函数源码分析 | 快速路径 | 慢速路径 | get_page_from_freelist 源码 )
文章目录 一、__alloc_pages_nodemask 函数源码分析 ( 快速路径 | 慢速路径 )二、get_page_from_freelist 快速路径 调用函数 完整源码 在 【Linux
日期 2023-06-12 10:48:40