Fork me on GitHub

随笔分类 -  Memory Management

摘要:内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程“并行”执行(实际上,也并行于内核自身的执行)。内核线程经常称之为(内核) 守护进程。它们用于执行下列任务。 周期性地将修改的内存页与页来源块设备同步(例如,使用mmap的文件映射)。 如果内存页很少使用 阅读全文
posted @ 2019-03-05 11:40 yooooooo 阅读(583) 评论(0) 推荐(0) 编辑
摘要:Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,6 阅读全文
posted @ 2019-03-03 22:07 yooooooo 阅读(801) 评论(0) 推荐(0) 编辑
摘要:1.前言 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。那么该如何分配呢?slab分配器就应运而生了,专为小内存分配而生。slab分配器分配内存以Byte为单位。但 阅读全文
posted @ 2019-02-24 16:22 yooooooo 阅读(1142) 评论(0) 推荐(1) 编辑
摘要:最近在学习内核模块的框架,这里做个总结,知识太多了。 分段和分页 先看一幅图 也就是我们实际中编码时遇到的内存地址并不是对应于实际内存上的地址,我们编码中使用的地址是一个逻辑地址,会通过分段和分页这两个机制把它转为物理地址。而由于linux使用的分段机制有限,可以认为,linux下的逻辑地址=线性地 阅读全文
posted @ 2019-02-17 15:54 yooooooo 阅读(571) 评论(0) 推荐(0) 编辑
摘要:Linux系统内存管理中存在着一个称之为OOM killer(Out Of Memory killer)的机制,该机制主要用于内存监控,监控进程的内存使用量,当系统的内存耗尽时,其将根据算法选择性地kill了部分进程。本文分析的内存溢出保护机制,也就是OOM killer机制了。 回到伙伴管理算法中 阅读全文
posted @ 2019-01-30 18:05 yooooooo 阅读(907) 评论(0) 推荐(0) 编辑
摘要:1. vmstat 参照《 "Linux CPU占用率监控工具小结 vmstat" 》 2. memstat memstat可以通过 安装,安装包括两个文件memstat和memstat.conf。 其中memstat.conf是memstat配置文件,指定memstat检索目录,里面应该包括主要的 阅读全文
posted @ 2019-01-03 10:32 yooooooo 阅读(666) 评论(0) 推荐(0) 编辑
摘要:1 固定映射 1.1 数据结构 linux高端内存中的临时内存区为固定内存区的一部分, 对于固定内存在linux内核中有下面描述 x86| arm| arm64 | | "arch/x86/include/asm/fixmap.h?v=4.7, line 67" | "arch/arm/includ 阅读全文
posted @ 2019-01-01 22:05 yooooooo 阅读(1770) 评论(0) 推荐(0) 编辑
摘要:1. 前言 KASAN是一个动态检测内存错误的工具。KASAN可以检测全局变量、栈、堆分配的内存发生越界访问等问题。功能比SLUB DEBUG齐全并且支持实时检测。越界访问的严重性和危害性通过我之前的文章(SLUB DEBUG技术)应该有所了解。正是由于SLUB DEBUG缺陷,因此我们需要一种更加 阅读全文
posted @ 2018-12-31 22:25 yooooooo 阅读(796) 评论(0) 推荐(0) 编辑
摘要:1 高端内存与内核映射 尽管 函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途. 重要的是强调以下事实 : 内核提供了其他函数用于将 页帧显式映射到内核空间, 这些函数与vmalloc机制无关. 因此, 这就造成了混乱. 而在高端内存的页 阅读全文
posted @ 2018-12-30 23:31 yooooooo 阅读(1756) 评论(0) 推荐(0) 编辑
摘要:1 内存中不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块. 在用户空间中这不是问题,因为普通进程设计为使用处理器的分页机制, 当然这会降低速度并占用TLB. 在内核中也可以使用同样的技术. 阅读全文
posted @ 2018-12-29 15:59 yooooooo 阅读(1242) 评论(0) 推荐(0) 编辑
摘要:1 前景回顾 1.1 内核映射区 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途. 重要的是强调以下事实 : 内核提供了其他函数用于将 页帧显式映射到内核空间, 这些函数与vmalloc机制无关. 因此, 这就造成了混 阅读全文
posted @ 2018-12-27 11:01 yooooooo 阅读(1836) 评论(0) 推荐(0) 编辑
摘要:在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着。目前,Marek Szyprowski和Michal Nazarewicz实现了一套全新的Contiguous Memory All 阅读全文
posted @ 2018-12-25 16:15 yooooooo 阅读(1193) 评论(0) 推荐(1) 编辑
摘要:1 前景回顾 在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法. Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, 后来Knuth又进行了更深刻的描述. 伙伴系统是一个结合了2的方幂个分配器和空闲缓冲 阅读全文
posted @ 2018-12-25 15:43 yooooooo 阅读(5375) 评论(0) 推荐(0) 编辑
摘要:1 前景提要 1.1 碎片化问题 分页与分段 页是信息的物理单位, 分页是为了实现非连续分配, 以便解决内存碎片问题, 或者说分页是由于系统管理的需要. 段是信息的逻辑单位,它含有一组意义相对完整的信息, 分段的目的是为了更好地实现共享, 满足用户的需要. 页的大小固定且由系统确定, 将逻辑地址划分 阅读全文
posted @ 2018-12-22 14:09 yooooooo 阅读(2321) 评论(0) 推荐(0) 编辑
摘要:内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。 什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。 关于操 阅读全文
posted @ 2018-12-09 14:56 yooooooo 阅读(679) 评论(0) 推荐(0) 编辑
摘要:1 今日内容(分页机制初始化) 在初始化内存的结点和内存区域之前, 内核先通过pagging_init初始化了内核的分页机制. 在分页机制完成后, 才会开始初始化系统的内存数据结构(包括内存节点数据和内存区域), 并在随后初始化buddy伙伴系统来接管内存管理的工作 2 分页机制初始化 arm64架 阅读全文
posted @ 2018-12-08 20:11 yooooooo 阅读(967) 评论(0) 推荐(0) 编辑
摘要:1. 今日内容(第二阶段(二)–初始化备用内存域列表zonelists) 我们之前讲了在memblock完成之后, 内存初始化开始进入第二阶段, 第二阶段是一个漫长的过程, 它执行了一系列复杂的操作, 从体系结构相关信息的初始化慢慢向上层展开, 其主要执行了如下操作 特定于体系结构的设置 在完成了基 阅读全文
posted @ 2018-12-08 19:54 yooooooo 阅读(859) 评论(0) 推荐(1) 编辑
摘要:1. 启动过程中的内存初始化 首先我们来看看start_kernel是如何初始化系统的, start_kerne定义在 "init/main.c?v=4.7, line 479" 其代码很复杂, 我们只截取出其中与内存管理初始化相关的部分, 如下所示 table th:nth of type(1){ 阅读全文
posted @ 2018-12-03 14:58 yooooooo 阅读(1962) 评论(0) 推荐(0) 编辑
摘要:在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的bootmem分配器就是系统初始化阶段使用的内存分配器. 为 阅读全文
posted @ 2018-11-30 15:07 yooooooo 阅读(1175) 评论(0) 推荐(0) 编辑
摘要:在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的boot阶段就是系统初始化阶段使用的内存分配器. 1 前景回 阅读全文
posted @ 2018-11-30 11:08 yooooooo 阅读(1905) 评论(0) 推荐(2) 编辑