![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
内存管理
文章平均质量分 90
主要总结Linux内存管理相关的知识
HZero.chen
随风潜入夜,润物细无声
展开
-
匿名页的反向映射
当通过fork创建子进程的时候,在这个过程中会建立反向映射的基础结构,具体在kernel_clone -》 copy_mm -》 dup_mm -》 dup_mmap中:《Linux内核深度分析》《深入理解Linux内核反向机制》原创 2022-06-26 21:32:46 · 651 阅读 · 0 评论 -
CMA简介
1. 前言CMA是一段连续的内存区域,它的所有页面都是可迁移类型,平时在不需要大块连续内存的时候,这段CMA区域可供系统或其它驱动使用,在驱动需要大块内存的时候,已占用的部分需要迁移出去,空闲出大块连续内存以供分配。 有两种CMA area:Global CMA area给大家共享,而per device CMA可以给指定的一个或者几个驱动使用2. 配置cma区域的大小有三种方式可以配置CMA区域大小,dts,commdline, 内核的配置项,优先级分别是dts > commandline原创 2022-02-25 14:36:15 · 1357 阅读 · 0 评论 -
setup_arch:bootmem_init : sparse_init
首先简单说明一下背景知识,启动阶段的内存模型一般有4种:FLATMEM,经典sparse和sparse vmemmap,以及zone devieFLATMEM这种模型适用于具有连续物理内存或大部分连续物理内存的非NUMA系统。 在FLATMEM内存模型中,有一个全局mem_map数组映射整个物理内存。对于即使是空洞的物理内存,也需要分配struct page结构体,只不过不会被初始化,映射到具体的物理内存。因此使用的时候要通过pfn_valid来进行检测,可以看到这样实际是浪费了一些struct pa原创 2022-02-19 14:35:57 · 829 阅读 · 0 评论 -
内存管理基础学习笔记 - 5.2 页面回收 - kswapd
目录1. 前言2. kswapd_init3.kswapd|- -balance_pgdat|- - -pgdat_balanced|- - -kswapd_shrink_node1. 前言本专题我们开始学习内存管理部分,本文为页面回收处理相关学习笔记。上节重要介绍了buddy慢速分配的过程,其中会唤醒kswapd线程进行内存回收,本节主要介绍kswapd线程周期性回收的过程。kswapd线程负责在内存不足的情况下回收页面,kswapd内核线程初始化时会为系统中每个NUMA内存节点创建一个名为"ksw原创 2021-03-24 16:57:03 · 946 阅读 · 0 评论 -
内存管理基础学习笔记 - 5.1 页面回收 - 概述
目录1. 前言2. 两种页面置换算法2.1 LRU经典链表算法2.2 第二次机会法3. 页面置换算法基础APIlru_cache_addlru_to_pagemark_page_accessed(todo)page_check_referencespage_referenced(todo)4. __alloc_pages_slowpath参考文档1. 前言本专题我们开始学习内存管理部分,本文为页面回收处理相关学习笔记。Linux页面回收主要考虑对文件映射页面和匿名映射页面的回收。kernel版本:5原创 2021-03-19 16:47:19 · 680 阅读 · 0 评论 -
内存管理基础学习笔记 - 4.3 缺页中断处理 - handle_pte_fault
目录1. 前言2. handle_pte_fault|- -do_anonymous_page|- -do_fault|- -do_swap_page|- -do_numa_page|- -do_wp_page1. 前言本专题我们开始学习内存管理部分,本文为缺页中断处理相关学习笔记。前面概述部分主要介绍了arm64缺页中断的底层逻辑,本文主要以数据异常的do_page_fault为例来说明缺页的详细处理过程。主要介绍do_page_fault->handle_pte_fault的执行过程。2.原创 2021-03-17 16:53:40 · 2949 阅读 · 1 评论 -
内存管理基础学习笔记 - 4.2 缺页中断处理 - do_page_fault
目录1. 前言2. do_page_fault|- -设置vm_flags和mm_flags标记|- -__do_page_fault|- -根据返回值fault做相应处理参考文档1. 前言本专题我们开始学习内存管理部分,本文为缺页中断处理相关学习笔记。前面概述部分主要介绍了arm64缺页中断的底层逻辑,本文主要以数据异常的do_page_fault为例来说明缺页的详细处理过程。2. do_page_faultdo_page_fault |--初始化vm_flags和mm_flags原创 2021-03-16 16:23:52 · 1936 阅读 · 0 评论 -
内存管理基础学习笔记 - 4.1 缺页中断处理 - 概述
目录1. 前言2. page fault的底层处理1. 前言本专题我们开始学习内存管理部分,本文为缺页中断处理相关学习笔记。Linux的缺页异常(page fault)必须区分两种情况:由编程错误引发的异常;由引用属于进程地址空间但尚未分配物理页框的页引起的异常。具体发生page fault的情况:1.如果写地址落在VMA区域,且权限合法访问地址落在VMA区域且权限为R+W,页表权限为R,则第一次写时会发生page fault ,内核会修改页表权限为R+W,并为之申请一页内存;2.如果访问地址原创 2021-03-15 11:15:39 · 2041 阅读 · 0 评论 -
内存管理基础学习笔记 - 3.3 进程地址空间 - mmap系统调用
目录1. 前言2. do_mmap函数说明总体参数说明prot参数说明flags参数说明file参数说明3. 映射类型1. 前言本专题我们开始学习内存管理部分,本文为进程地址空间的学习笔记。mmap/munmap接口是用户空间最常用的一个系统调用接口,主要用于:用户空间分配内存、读写大文件、链接动态库文件,多进程间共享内存。mmap最终底层调用的的内核函数是do_mmap,本文主要介绍do_mmap的执行过程。2. do_mmap函数说明unsigned long do_mmap(struct f原创 2021-03-13 13:28:27 · 549 阅读 · 0 评论 -
内存管理基础学习笔记 - 3.2 进程地址空间 - brk系统调用
目录1. 前言2. SYSCALL_DEFINE1(brk, unsigned long, brk)|- -do_brk_flags|- -mm_populate1. 前言本专题我们开始学习内存管理部分,本文为进程地址空间的学习笔记。malloc函数是C函数库封装的一个核心函数,C函数库会做一些处理后调用Linux内核系统去调用brk,如果把malloc想想成零售,brk就是代理商。malloc函数的实现为用户进程维护一个本地小仓库,当进程需要使用更多的内存时就向这个小仓库要货,小仓库存量不足时就通过原创 2021-03-10 10:22:43 · 1355 阅读 · 0 评论 -
内存管理基础学习笔记 - 3.1 进程地址空间 - VMA线性区
目录1. 前言2. 进程地址空间3. 用户空间与内核空间的隔离4. 进程地址空间主要数据结构struct mm_structstruct vm_area_struct5. vma的标志属性6. vma主要API查找vma插入vma删除vma合并vma参考文档1. 前言本专题我们开始学习内存管理部分,本文为进程地址空间的学习笔记。通过前几节的内容可以看到,内核中的函数以非常直接的方式动态获取内存,如alloc_pages/__get_free_pages直接从buddy分配,kmem_cache_all原创 2021-03-06 16:48:52 · 966 阅读 · 0 评论 -
内存管理基础学习笔记 - 2. 内核地址空间 - vmalloc
目录1. 前言2. vmalloc|- -__get_vm_area_node|- - -alloc_vmap_area|- - -setup_vmalloc_vm|- -__vmalloc_area_node参考文档1. 前言本专题我们开始学习内存管理部分,本文为vmalloc的学习笔记。vmalloc主要分配那些虚拟地址连续,而物理地址不要求连续的内存块。vmalloc底层调用的仍然为buddy系统,只不过vmalloc不像slab那样分配的是多个页面的连续物理内存,而是每次只通过alloc_pa原创 2021-03-05 16:57:23 · 721 阅读 · 0 评论 -
内存管理基础学习笔记 - 2. 内核地址空间 - SLAB
目录1. 前言2. slab总体说明3. kmem_cache_create|- -__kmem_cache_create|- - -setup_cpu_cache4. kmem_cache_alloc|- -cache_alloc_refill5. 释放slab对象6. kmalloc7. slab debug参考文档1. 前言本专题我们开始学习内存管理部分,本文为slab分配器的学习笔记。slab是1.slab用来解决小内存块分配问题,不同于buddy以页为单位分配2.slab实际也是通过bud原创 2021-03-05 13:56:03 · 542 阅读 · 0 评论 -
内存管理基础学习笔记 - 2. 内核地址空间 - 伙伴系统
目录1. 前言2. 分配掩码3. alloc_pages|- -get_page_from_freelist|- - -rmqueue4. free_pages|- -free_the_page|- - -free_unref_page|- - -__free_one_page参考文档1. 前言本专题我们开始学习内存管理部分,本文开始主要记录伙伴系统分配/释放内存的过程。本文主要讲述buddy分配内存的过程,也就是函数alloc_pages的执行过程,此处主要以 GFP_KERNEL分配掩码为例分析分配原创 2021-03-02 15:36:44 · 903 阅读 · 1 评论 -
内存管理基础学习笔记 - 1. 概述
目录1. 前言2. 回顾说明地址空间映射内存管理启动部分1. 前言本专题文章承接之前《kernel启动流程-start_kernel的执行》专题文章,本专题我们开始学习内存管理部分,本文是概述部分。kernel版本:5.10平台:arm642. 回顾说明地址空间映射在《kernel启动流程-start_kernel的执行_2.setup_arch》我们已经看到如下图的地址空间映射:也即是说在内存初始化阶段已经为物理地址空间创建了映射关系,包括memblock.memory区域,kernel原创 2021-03-01 11:14:33 · 1088 阅读 · 0 评论