内存管理
文章平均质量分 94
奇小葩
学习,思考,总结
展开
-
文件系统(八)—文件系统的前世今生
原文:An Introduction to Linux’s EXT4 Filesystem链接: https://opensource.com/article/17/5/introduction-ext4-filesystem本文的目的是仔细阅读EXT4的历史记录,功能和最佳使用,并了解其与Ext文件系统的先前迭代的不同之处。在先前关于Linux文件系统的文章中,我写了一份说明书去介绍Linux文件系统,里面有一些高级的概念,比如说,一切都是文件。我很想去深入地讨论更多EXT文件系统的特性的信息。所以原创 2022-05-22 23:12:39 · 1300 阅读 · 0 评论 -
Linux 内核 VS 内存碎片 (上)
转载:https://pingcap.com/zh/blog/linux-kernel-vs-memory-fragmentation-1(外部)内存碎片是一个历史悠久的 Linux 内核编程问题,随着系统的运行,页面被分配给各种任务,随着时间的推移内存会逐步碎片化,最终正常运行时间较长的繁忙系统可能只有很少的物理页面是连续的。由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的 (除非使用大页),但对于需要从内核线性映射区分配连原创 2022-05-01 09:56:29 · 610 阅读 · 0 评论 -
linux内存回收(三)--OOM Killer
当业务繁忙的服务器里,我们常常发现系统在非常大的内存压力情况下,触发了OOM Killer机制,OOM Killer机制是内存管理中在资源极端缺乏情况下一种迫不得已的进程终止机制,OOM Killer机制会根据算法选择并终止占用内存资源较多的进程,以便释放内存资源。本章的主要内容是了解OOM Killer是如何运转的。1 触发过程根据内存回收的流程,在慢速路径__alloc_pages_slowpath中,当反复尝试reclaim和compact后仍不成功,就会调用__alloc_pages_may_o原创 2021-10-24 22:57:17 · 4193 阅读 · 0 评论 -
linux内存回收(二)--直接内存回收机制
以下是几个常见的页面分配函数,可以看到最终都会调用__alloc_pages_nodemask()[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xuNvsneK-1633779953086)(D:\学习笔记\内存管理总结\内存回收.assets\bprgzwjybv.png)]核心梳理__alloc_pages_nodemask():上面我们看到__alloc_pages_nodemask()即页面分配器的’心脏’了,接下来我们就梳理下这颗’心脏’中都具体做了哪些事情,原创 2021-10-17 19:41:57 · 3447 阅读 · 1 评论 -
linux内存回收(一)---kswapd回收
正式开始十一之旅,有大量的时间将目前工作中遇到的内存回收进行总结下,主要是对内存回收的整个过程进行重新梳理。在linux操作系统中,当内存充足的时候,内核会尽量使用内存作为文件缓存(page cache),从而提高系统的性能。例如page cache缓冲硬盘中的内容,dcache、icache缓存文件系统的数据,这些内容是为了提升性能而设计的,还可以再次从硬盘中重新读取来构建对象,这部分内容可以在内存紧张的时候可以直接释放。所以内存回收在Linux内存管理中占据非常重要的地位,系统的内存毕竟是有限原创 2021-10-07 21:23:04 · 6286 阅读 · 3 评论 -
linux内存管理笔记(四十二)----内存规整
伙伴系统是以页面为单位管理内存,内存碎片也是基于页面,即由大量离散且不连续的页面组成。从内核的角度,出现内存碎片不是什么好的事情,例如有些情况下物理设备需要大量的连续的物理内存,如果内核无法满足,就会发生内核错误所以内核对于内存碎片化,需要重新规划调整,因此就出现了本章的主题,内存规整技术,它是为了解决内存碎片化而出现的。本章主要是了解如下内容内存规整的基本原理如何触发内存规整内存规整的使用方法内存碎片的优化方法1. 内存规整的基本原理Linux使用的原创 2021-03-27 23:08:29 · 3155 阅读 · 0 评论 -
linux内存管理笔记(四十一)----swap分区
前面我们学习了操作系统通过“虚拟内存”技术,不但在功能上突破了物理内存的限制,使程序可以操作大于实际物理内存的空间;更重要的是,隔离了每个进程的安全保护,使每个进程都不受其他程序的干扰。但是,对于系统内存,总是会存在一种场景当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用,那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中正是因为 Linux 上原创 2021-03-24 22:13:00 · 1943 阅读 · 1 评论 -
linux内存管理笔记(四十)----内存回收调节
kswapd是linux中用于页面回收的内核线程。页面回收,并不是回收得越多越好,而是力求达到一种balanced。因为页面回收总是以cache丢弃、内存swap、等为代价的,对系统性能会有一定程度的影响。1 LRU链表在最近几十年操作系统的发展过程中,出现了很多的页面置换算法,其中每一个页面置换算法都有各自的优缺点。但是linux内核中采用的主要是经典的LRU链表算法和第二次机会算法。。LRU(Least Recently Used):最近最少使用。根据局部性原理,LRU假定最近不使用的页面在较短的原创 2021-03-23 21:03:18 · 2293 阅读 · 0 评论 -
linux内存管理笔记(三十九)----kswapd内存回收
在linux操作系统中,当内存充足的时候,内核会尽量使用内存作为文件缓存(page cache),从而提高系统的性能。例如page cache缓冲硬盘中的内容,dcache、icache缓存文件系统的数据,这些内容是为了提升性能而设计的,还可以再次从硬盘中重新读取来构建对象,这部分内容可以在内存紧张的时候可以直接释放。所以内存回收在Linux内存管理中占据非常重要的地位,系统的内存毕竟是有限的,跑的进程成百上千,系统的内存越来越小,必须提供内存回收的机制,以满足别的任务的需求。在内存回收的过程中,会遇到以原创 2021-03-21 20:38:00 · 4589 阅读 · 1 评论 -
linux内存管理笔记(三十八)----反向映射
用户进程在使用虚拟内存的过程中,从虚拟内存页面映射到物理内存页面时,PTE保留这个记录,page数据结构中的_mapcout记录有多少个用户PTE映射到物理页面。用户PTE是指用户进程地址空间到物理页面的建立映射的PTE,不包括内核地址空间映射到物理页面所产生的PTE,其要面对以下的问题有些页面需要迁移有些页面长时间不适用,需要交换到磁盘在交换之前,必须找到哪个进程适用这个页面,然后解除这些映射的用户PTE一个物理页面可以同时被多个进程的虚拟内存映射,但是一个虚拟页面同时只能映射到一个物理页面原创 2021-03-13 11:04:24 · 2664 阅读 · 1 评论 -
linux内存管理笔记(三十七)----临时页表映射过程
为了降低启动代码的复杂性,进入linux内核的时候,MMU使关闭的。如果关闭MMU,意味着不能利用高速缓存的性能,那么内核使如何要打开MMU并使能数据高速缓存呢?在关闭MMU的情况下,处理器访问的地址都是物理地址。当MMU打开后,处理器访问地址就变成虚拟地址目前的处理器都是多级流水行架构,处理器会提前预取多条指令到流水线中。当打开MMU后,处理器之前预取的指令就会以虚拟地址来访问,到MMU查找对应的物理地址。因此,为了保证处理器在开启MMU后,能完成从物理地址到虚拟地址的平滑过渡,首先会创建V原创 2021-03-06 19:56:46 · 3241 阅读 · 2 评论 -
linux内存管理笔记(三十六)----写时复制
缺页中断是内核在访问一个虚拟地址时,发现该虚拟地址所在的页没有一个物理页框与之相对应,就会触发缺页异常进入物理页面分配的异常函数。而写时复制是指,父进程在fork出子进程的时候,并不会为子进程马上分配物理页框,而是当复进程或者子进程需要对内存进行写操作时,才会分配物理页框,分配时,先将内容完全复制到新页框,然后再进行改写,称为写时复制。1. 写时复制原理 在传统的unix操作系统中,当执行fork系统调用时,内核复制父进程的整个用户空间并把复制得到的那一份分配给子进程,这种行为就非常耗时原创 2021-02-07 17:02:37 · 1572 阅读 · 0 评论 -
linux内存管理笔记(三十五)----文件映射
当没有找到对应的PTE并且没有设置vma->vm_ops时候,就会触发匿名缺页异常,那么如果vm_ops操作函数存在的情况下,该如何处理呢?本章主要是学习文件映射存在的情况下,会产生文件映射缺页异常的处理流程。1. 代码流程对于文件映射缺页异常,内核会调用do_fault()函数进行处理,do_fault()函数处理大致分为以下三种情况static int do_fault(struct fault_env *fe){ struct vm_area_struct *vma = fe->原创 2021-01-14 22:37:17 · 2501 阅读 · 1 评论 -
linux内存管理笔记(三十四)----匿名映射
匿名内存是用户空间的概念,不涉及内核态内存。匿名内存的概念是指一段虚拟内存映射是否与之相关联的对象,如果没有关联对象就称为匿名的。本章就主要学习缺页异常的匿名映射,其中涉及到以下内容匿名映射的概念匿名映射的流程1. 概念由于应用程序申请内存后,内核分配了虚拟内存,当访问所需要的的内存时候,才会分配实际的物理内存,才能节省实际内存的使用。我们来看看匿名映射和文件映射的区别匿名页面,是指那些没有关联到文件页,如进程堆、栈、数据段和任务已修改的共享库等,不是以文件形式存在,因此无法和磁盘文件交换原创 2021-01-03 22:05:04 · 6379 阅读 · 0 评论 -
linux内存管理笔记(三十三)-----__do_page_fault处理流程
上一章重点学习了内核对于异常处理的总体的流程,从异常向量为入口,最终调用到真正的异常处理的接口__do_page_fault,本章主要是学习之前提到的内存缺页异常的常见场景中如何实现static int __kprobes__do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, unsigned int flags, struct task_struct *tsk){ struct vm_area_st原创 2020-12-21 22:39:21 · 4098 阅读 · 0 评论 -
linux内存管理笔记(五)---缺页异常概述
在实际需要某个虚拟内存区域的数据之前,虚拟和物理内存之间的关联不会建立。如果进程访问的虚拟地址空间尚未与页帧关联,处理器自动地发一个缺页异常,内核必须处理此异常。这是内存管理中最重要、最复杂的方面之一,因为必须要考虑无数的细节缺页异常时由于访问用户地址空间中的有效地址而引起的,还是应用程序试图访问内核的受保护区域?目标地址对应于某个现存的映射吗?获取该区域的地址,需要使用何种机制?缺页异常处理的实现因处理器的不同而有所不同,本文针对ARM32的处理流程进行学习,了解其基本的处理流程。1. 缺页原创 2020-12-20 12:22:17 · 5471 阅读 · 3 评论 -
linux内存管理笔记(三十二)----内存映射mmap
内存映射是一个很有趣的思想,我们都知道操作系统分为用户态和内核态,用户态是不能直接和物理设备打交道,如果我们用户空间想访问硬盘的一块区域数据,则需要两次拷贝(硬盘->内核->用户),但是内存映射的设计只需要发生一次拷贝,大大提高了读取数据的效率。那么内存映射的原理和内核是如何实现的呢?1. 内存映射概念内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映给用户空间,对于用户空间和内核原创 2020-11-15 21:01:23 · 1731 阅读 · 0 评论 -
linux内存管理笔记(三十一)----malloc
学习完了用户进程地址空间地址空间,那么从本章开始学习下用户空间的内存分配。对于我们来说,对是进程中用于动态分配变量和数据的内存区域,堆的管理对应用程序员来说是不可见的。因为它依赖于标准库提供的各种辅助函数(malloc)来分配任意长度的内存区。使用malloc,相对于栈空间而言,堆内存面临着更为复杂的情况。那么malloc在堆上分配内存到底是如何实现的呢?主要内容包括如下:堆的内存怎么从内核中申请怎么有效地进行堆内存管理1. malloc简介malloc函数使C/C++中常用内存分配库函数,使用原创 2020-11-13 23:41:15 · 1991 阅读 · 0 评论 -
linux内存管理笔记(三十)----进程虚拟地址
在前面的章节中,我们主要关注的是内核的虚拟地址空间的管理。从本节开始,我们重点关注管理用户空间的方法,其中由于种种原因,这个比内核地址空间管理更复杂。本节主要围绕以下内容:用户进程的虚拟地址空间是Linux的一个重要抽象,它向每个运行进程提供了同样的系统,每个应用程序都有自身的地址空间,与所有的应用程序分割开,不会干扰到其他进程内存的内容。在内核的虚拟地址空间中,只有很少的段可用于各个用户空间进程,这些段彼此有一定的距离,内核需要一些数据结构来有效的管理这些分布的段地址空间中只有极少的一部分与物理页原创 2020-10-25 22:59:29 · 1483 阅读 · 0 评论 -
linux内存管理笔记(二十九)----vmalloc
前面我们学习了linux内核中对于物理上连续的分配方式,采用伙伴系统和slub分配器分配内存,但是我们知道物理上连续的映射是最好的分配方式,但并不总能成功地使用。在分配一大块内存时,可能竭尽全力也无法找到连续的内存块。针对这种情况内核提供了一种申请一片连续的虚拟地址空间,但不保证物理空间连续,也就是vmalloc接口。vmalloc的工作方式类似于kmalloc,只不过前者分配的内存虚拟地址连续,而物理地址则无需连续,因此不能用于dma缓冲区通过vmalloc获得的页必须一个一个地进行映射,效率不高,原创 2020-08-30 23:38:28 · 3547 阅读 · 0 评论 -
linux内存管理笔记(二十八)----内存管理 slub算法
内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是slub系统。slub系统运行在伙伴系统之上,为内核提供小内存管理的功能。 slub把内存分组管理,每个组分别包含23、24、…211个字节,在4K页大小的默认情况下,另外还有两个特殊的组,分别是96B和192B,共11组。之所以这样分配是因为如果申请212B大小的内存,就可以使用伙伴系统提供的接.原创 2020-08-23 20:57:06 · 1165 阅读 · 0 评论 -
linux内存管理笔记(二十七)----slub分配器概述
在linux的内核运行需要动态分配内存的时候,其中有两种分配方案:第一种是以页为单位分配内存,即一次分配内存的大小必须是页的整数倍第二种是按需分配,一次分配的内存大小是随机的 对于第一种方案是通过伙伴系统实现,以页为单位管理和分配内存,但是这个单位确实也太大了。对于第二种方案,在现实的需求中,如果我们要为一个10个字符的字符串分配空间,如果按照伙伴系统采用分配一个4KB或者更多空间的完整页面,不仅浪费而且完全不可接受。显然的解决方案是需要将页拆分为更小的单位,可以容纳大量的小对象。同时原创 2020-08-12 22:51:52 · 1309 阅读 · 0 评论 -
linux内存管理笔记(二十六)----伙伴系统页面释放
对于内存释放函数也可以归纳到一个主要的函数(__free_pages),只是用不同的参数调用而已,前者是通过page,后者是通过虚拟地址addr,其定义如下extern void __free_pages(struct page *page, unsigned int order);extern void free_pages(unsigned long addr, unsigned int order);对于free_pages和__free_pages之间的关系,首先需要将虚拟地址转换成指向st原创 2020-07-16 23:17:22 · 1256 阅读 · 0 评论 -
linux内存管理笔记(二十四)----伙伴系统页面分配
上一章学习了伙伴系统的设计思路和其申请和释放API的使用方式,本章主要是梳理下伙伴系统分配是如何分配出连续的物理页面的。内核中常用的分配物理内存页面的接口是alloc_pages,用于分配一个或者多个连续的物理页面,分配的页面个数只能是2^n。相对于多次离散的物理页面,分配连续的物理页面有利于提高系统内存的碎片化。1. 页的分配 对于所有的内存分配接口,最后都会调用alloc_pages_node,这个是伙伴系统最重要的接口,其定义如下:static inline struct page *all原创 2020-07-13 00:06:35 · 1497 阅读 · 0 评论 -
linux内存管理笔记(二十三)----伙伴系统Linux概述
在内核初始化完成后,内存管理的责任由伙伴系统承担,本章正式开始伙伴系统的学习,本章主要是原理性的梳理一些流程,其主要包括linux对于伙伴系统的设计思路内存碎片的问题和分配器如何处理碎片伙伴系统的分配器API1. 设计思路前面章节中学习了伙伴系统原理,我们重新梳理伙伴系统的核心思路:内核将系统的空闲页面分成11个块链表,每个块链表分别管理着1,2,4,8,16,32,64,128,256,512和1024个物理页帧号,每个页面大小为4K bytes,那么对于伙伴系统管理的块大小范围从4K by原创 2020-07-06 22:56:08 · 1307 阅读 · 1 评论 -
linux内存管理笔记(二十一)----启动伙伴系统
众所周知,Linux内存管理的核心是伙伴系统(buddy system)。其实在linux启动的那一刻,内存管理就已经开始了,只不过不是buddy在管理。在内核中,实现物理内存管理的allocator包括:连续物理内存管理buddy allocator非连续物理内存管理vmalloc allocator小块物理内存管理slab allocator高端物理内存管理kmapper初始化阶段物理内存管理memblock在系统初始化阶段会先启用一个bootmem分配器和membloc原创 2020-06-16 22:27:29 · 1370 阅读 · 0 评论 -
linux内存管理笔记(二十)--------zonelist初始化
在bootmem_init初始化的时候,已经初始化了内存节点的zone成员,该成员是struct zone数组,存放该内存节点的zone信息。在linux的内存管理中,分几个阶段进行抽象,用数据结构来管理。先用结点集合管理内存,然后用zone管理结点,再用页的管理zone。此时使用的数据结构分别为pglist_data、zone、page结构体,本章的主要是来分析内核是如何完成zonelist的初始化。1. 数据结构在结点的pglist_data数据结构中有一个node_zone_list[]类型的st原创 2020-06-13 11:43:03 · 3846 阅读 · 1 评论 -
linux内存管理笔记(二十二)----伙伴系统原理
在内核初始化完成后,内存管理将成为一项重要的工作。如何频繁的申请释放内存的情况下,如何避免碎片的产生,这就要求内核采取灵活而恰当的分配策略。通常,内存分配一般有以下两种情况大对象(大的连续空间分配)小对象(小的空间分配)针对不同的需求,Linux采取了不同的方式来解决这两种问题导致的内存碎片问题。本章主要是从原理上分析内核如何通过伙伴系统算法,如何解决了内存碎片问题。1. 内存碎片问题在前面的章节中,我们知道在内存管理中,存在两种碎片情况内部碎片:是指已经分配出去的内存空间,却不能被利用原创 2020-06-10 22:00:19 · 1867 阅读 · 0 评论 -
linux内存管理笔记(十九)----内存组织
通过linux内存管理笔记(十七)----linux内存模型,我们知道了linux的内存模型,通过上bootm,我们梳理了Node, Zone, Page Frame的整个流程,本章就来整理其关系和数据结构之间的关系。1. 基本概念NUMA(Non-Uniform Memory Access,非统一内存访问)和UMA(Uniform Memory Access,统一内存访问):NUMA是从处理器对内存访问速度不同的结构UMA是处理器与所有内存的访问速度相同的结构结点Node:从1个CPU访原创 2020-06-07 22:20:55 · 957 阅读 · 0 评论 -
linux内存管理笔记(十八)----bootmem内存分配器
前面章节我们介绍了memblock,其作用内核启动初期,常用的内存分配器还未被初始化而不能使用,在此期间memblock是一种用于内存管理区域的方法。然后调用page_init来完成系统分页机制的初始化工作,建立页表,从而内核可以完成虚拟地址到物理地址的映射关系,本章主要是分析bootmem_init的流程。1. bootm初始化arm架构下, 在setup_arch中通过paging_init函数初始化内核分页机制之后, 内核通过bootmem_init()开始完成内存结点和内存区域的初始化工作,其函原创 2020-06-06 10:46:28 · 1615 阅读 · 0 评论 -
linux内存管理笔记(十七)----linux内存模型
前面已经分析把物理内存添加到memblock以及给物理内存建立页表映射,这里我们分析sparse内存模型。在Linux内核中支持3种内存模型,分别为flat memory modelDiscontiguous memory modelsparse memory model所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux kernel中,使用什么的方式来管理这些物理内存。某些体系架构支持多种内存模型,但在内核编译构建时只能选择使用一种内存模型。1. 基原创 2020-05-24 22:53:34 · 2899 阅读 · 0 评论 -
linux内存管理笔记(十六)----ARM32内存空间分配
Linux内核一般将处理器的虚拟地址空间分成两部分,在32系统上,地址空间在用户进程和内核之间划分的典型比例为3:1,在给出的4GB的虚拟地址空间中,0 ~ 3GB将用于用户空间而3GB ~ 4GB将用于内核空间,内核提供了相关的配置项来修改该比例,也就是说Kernel最多寻址1GB的虚拟地址空间。当CPU启动MMU后,CPU访问的时虚拟地址空间,然后由MMU根据页表转换成物理地址,页表是由Kernel维护的,所以Kernel可以决定1GB的虚拟地址空间具体映射到什么物理地址。但是不管Kernel怎么映射原创 2020-05-14 21:42:06 · 3765 阅读 · 0 评论 -
linux内存管理笔记(十五)----设备区域映射
我们知道默认外设I/O资源部在linux的内核空间中,如果我们想要访问外设I/O,必须先将其地址映射到内核空间中,然后才能在内核空间中访问它。Linux内核访问外设I/O内存资源的方式有两种动态映射(ioremap)静态映射(map_desc)动态映射的方式是我们使用的比较多,而且比较简单的方式,即直接通过内核提供的ioremap函数动态创建一段外设I/O内存资源到内核虚拟地址的映射表,从而就可以在内核空间中访问了。同时内核也提供了在系统启动时通过map_desc结构体静态创建I/O资源到内核空间原创 2020-05-11 22:36:52 · 915 阅读 · 0 评论 -
linux内存管理笔记(十四)----dma_contiguous_remap
在第linux内存管理笔记(十一)—CMA中,我们学习了操作系统预留的大量的连续内存,我们对其引入的原因和使用方法进行了分析,其主要是用于内核中分配连续的大块内存。当设备驱动不适用时,内存管理系统将该区域用于分配和管理可移动类型页面当驱动程序使用时,用于连续内存分配,此时已经分配的页面进行迁移这样既可以在内核中分配连续的大内存,同时又不浪费内存空间,因为当内存不足的时候,可以通过内存迁移实现内存重新分配的方式。通过之前的分析,当启动的时候通过arm_memblock_init->dma_co原创 2020-05-10 22:53:13 · 1183 阅读 · 0 评论 -
linux内存管理笔记(十三)----页表映射
Linux内核中一般采用的是3级映射模型,第一层是页面目录(PDG),第二层是中间目录(PMD),页表(PTE),其三级映射的框图如下:对于IMX6UL架构中,可以采用按段来映射,这时候采用的是一级页表,内存中有一个映射段,表中有4096个表项,每个表项大小为4Byte,所以这个映射表的大小为16KB,而且其位置必须是16KB边界对齐,每个段表项可以寻址1MB的大小的地址空间。当CPU访问内存...原创 2020-05-07 23:12:31 · 3367 阅读 · 2 评论 -
linux内存管理笔记(十二)----准备页表
Linux是为通用的操作系统而设计,为了便于移植需要抽象出一些硬件细节,在驱动代码中看到大量的抽象层的思想。内核中只有和硬件相关的代码才会单独实现,这样做便于移植和添加新硬件。内核里所有进程和内核线程都共享1GB的地址空间,而每个应用程序对应的进程都有独立的3GB的地址空间,相互不干扰用户空间:在Linux中,每个用户进程都可以访问4GB的线性地址空间,从0到3GB的虚拟地址空间是用户空间,...原创 2020-04-19 21:29:03 · 1269 阅读 · 1 评论 -
linux内存管理笔记(十一)---CMA
在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,对于内核如果申请一块连续的内存空间该怎么处理呢?首先向到的是利用内核提供的kmalloc申请,尽管kmalloc可以申请连续的内存空间,但是在长时间的测试中,会出现内存空间可能申请失败的情况,无法保证能成功分配。使用memblock分配器中提供的方法,称为预留内存,但这么预留...原创 2020-04-06 18:25:06 · 3940 阅读 · 1 评论 -
qemu+gdb 调试imx6学习笔记
准备对Linux的内存管理单元进行学习,单纯阅读源码还是不如一步一步调试内核理解深刻,对于调试内核的方法,网上也有不少,主要是利用Qemu+GDB+IMX6对内核进行调试。1. Qemu简介QEMU的英文单词是:QuickEmulator,它是一个小巧的模拟器。还有很多模拟器,比如VMWare、Virtual Box等。但是VMWare、VirtualBox只能模拟x86、AMD64/Inte...原创 2020-04-05 11:08:25 · 1555 阅读 · 2 评论 -
linux内存管理笔记(九)--- fixmap
在系统启动的汇编阶段,我们建立了临时页表,开启了MMU,进入了虚拟空间的世界,进入到start_kernel,内核要访问内存,要访问IO地址空间,那么就必须要位物理地址建立页表,以实现物理地址和虚拟地址之间的映射。在内核初始化前期,内存管理系统还未初始化,现在除了临时页表外,主要的还是kernel image空间,其余的物理内存都没有建立页表,那么对于内存管理相关的API接口都无法使用,内核提出...原创 2020-03-07 22:36:49 · 1983 阅读 · 1 评论 -
linux内存管理笔记(十)--- memblock分配器
Linux内核使用伙伴系统管理内存,那么在伙伴系统之前,内核使通过memblock来管理。在系统启动阶段,使用memblock记录物理内存的使用情况,首先我们知道在内核启动后,对于内存,分成好几块内存中的某些部分使永久分配给内核的,例如代码段和数据段,ramdisk和dtb占用的空间等,是系统内存的一部分,不能被侵占,也不参与内存的分配,称之为静态内存GPU/camera/多核共享的内存都需...原创 2020-03-03 22:35:38 · 2696 阅读 · 1 评论