随笔分类 -  内存管理

摘要:图:反向映射的基本概念 图:反向映射的原理 图:反向映射应用之内存回收 第一个场景是内存回收,内存不足时内核会从不活跃的lru链表尾部回收一些页面,而对于映射到进程地址空间的物理页面,我们需要在回收之前对他做解除映射处理。 对于匿名页,由于里面的数据是进程运行过程中产生的有用数据,不能随意丢弃,需要 阅读全文
posted @ 2022-04-11 20:29 penghan 阅读(109) 评论(0) 推荐(0) 编辑
摘要:vmalloc是一个接口函数, 内核代码使用它来分配在虚拟内存中连续但在物理内存中不一定连续的内存。 只需要一个参数,以字节为单位。 使用vmalloc的最著名的实例是内核对模块的实现. 因为模块可能在任何时候加载, 如果模块数据比较多, 那么无法保证有足够的连续内存可用, 特别是在系统已经运行了比 阅读全文
posted @ 2018-12-28 16:54 penghan 阅读(6708) 评论(0) 推荐(1) 编辑
摘要:kmem_cache如下: kmem_cache_cpu定义如下: kmem_cache_node定义如下: 总的来说,slub分配object,先从c->freelist找,如果为空,再从c->page里transfer object到freelist(get_freelist).如果依然找不着, 阅读全文
posted @ 2018-12-21 17:51 penghan 阅读(635) 评论(0) 推荐(0) 编辑
摘要:在numa架构下,slab分配object: 首先,调用____cache_alloc来分配,该函数实现如下: 1. 先从array cache里面去找,如果找到,返回,如果没找到,走到2. 2.调用cache_alloc_refill来从node的shared里去找object,或者slab的pa 阅读全文
posted @ 2018-12-20 15:02 penghan 阅读(579) 评论(0) 推荐(0) 编辑
摘要:在此向郭大侠致敬。 一、前言 数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希 阅读全文
posted @ 2018-09-18 15:10 penghan 阅读(381) 评论(0) 推荐(0) 编辑
摘要:1.前言 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。那么该如何分配呢?slab分配器就应运而生了,专为小内存分配而生。slab分配器分配内存以Byte为单位。但 阅读全文
posted @ 2018-09-18 14:50 penghan 阅读(1033) 评论(0) 推荐(0) 编辑
摘要:上面是一些页表的结构体,下面是初始化ept页表。每个页大小为2MB. 对创建的EPT页表做测试。 线性区的页相关的那些标志。它们存放在vm_area_struct描述符的vm_flags字段中。一些标志给内核提供有关这个线性区全部页的信息,例如它们包含有什么内容,进程访问每个页的权限是什么。 另外的 阅读全文
posted @ 2017-04-13 17:31 penghan 阅读(874) 评论(0) 推荐(0) 编辑
摘要:对于x86_64来说,逻辑地址由16位选择子和64位偏移量组成(而32位时,逻辑地址由16位段选择符和32位偏移量组成),段寄存器仅仅存放选择子。CPU的分段单元(SU)执行以下操作:[1] 先检查选择子的TI字段,以决定描述子对应的描述子保存在哪一个描述符表中。TI字段指明描述子是在GDT中(在这 阅读全文
posted @ 2017-03-03 09:23 penghan 阅读(1905) 评论(1) 推荐(0) 编辑
摘要:我们经常用free查看服务器的内存使用情况,而free中的输出却有些让人困惑,如下: 先看看各个数字的意义以及如何计算得到: free命令输出的第二行(Mem):这行分别显示了物理内存的总量(total)、已使用的 (used)、空闲的(free)、共享的(shared)、buffer(buffer 阅读全文
posted @ 2017-01-25 09:54 penghan 阅读(1461) 评论(0) 推荐(0) 编辑
摘要:还有PAGE_OFFSET,内核中通常为3G。这几个宏把无符号整数转换成对应的类型 根据x把它转换成对应的无符号整数 与下一个页框对齐 把内核空间的线性地址转换为物理地址 把物理地址转化为线性地址 把pfn页框号转化为内核线性地址, 然后左移12位, 得到对应的内核线性地址 根据页框号得到对应的物理 阅读全文
posted @ 2016-11-09 14:40 penghan 阅读(498) 评论(0) 推荐(0) 编辑
摘要:1 #define container_of(ptr, type, member) ({ \ 2 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 3 (type *)( (char *)__mptr - offsetof(type,mem 阅读全文
posted @ 2016-06-15 09:11 penghan 阅读(2424) 评论(0) 推荐(0) 编辑