随笔分类 -  内存子系统

Linux内存管理
摘要:meminfo Documentation/filesystem/proc.rst对meminfo的描述如下: Provides information about distribution and utilization of memory. This varies by architecture 阅读全文
posted @ 2024-09-03 16:09 ZouTaooo 阅读(46) 评论(0) 推荐(1) 编辑
摘要:前言 熟悉伙伴系统的管理机制以及伙伴系统提供的内存分配API方式以后我们知道,伙伴系统提供了以分配阶为参数的连续page的分配接口。但是在内核中并不是在所有时候都要求分配的内存在物理上连续,只需要在逻辑上连续即可。比如,随着系统的使用,分配连续的大的内存块由于内存碎片的存在是有可能失败的。因此分配逻 阅读全文
posted @ 2023-10-08 16:59 ZouTaooo 阅读(223) 评论(0) 推荐(0) 编辑
摘要:前言 看完了伙伴系统的设计、slab分配器的设计、vmalloc、kmalloc这些内容对于内存管理的一些细节上好像比较清楚了,但是内核是如何使用内存的还是有一些混淆。也产生了一些疑问,在内核中内存的正确打开方式是什么呢? 内核地址空间划分 首先我们需要搞情况内核的地址空间,不同地址空间的内存的使用 阅读全文
posted @ 2023-10-08 16:20 ZouTaooo 阅读(137) 评论(0) 推荐(0) 编辑
摘要:前言 内核地址空间的划分 VMALLOC_START和VMALLOC_END之间的区域用于vmalloc分配逻辑上连续物理上不连续的内存。 内核地址空间中还有一段区间用于高端内存的持久映射,PKMAP_BASE和FIXADDR_START,如果存在高端内存可以通过alloc_pages_node分配 阅读全文
posted @ 2023-10-08 16:14 ZouTaooo 阅读(114) 评论(0) 推荐(0) 编辑
摘要:前言 slab分配器从伙伴系统获取页帧进行管理,对外为一些固定size的小内存块和特定内核数据结构提供缓存和内存分配服务。slab分配器为的是满足内核中小内存块的分配需求,毕竟伙伴系统的内存分配以page为单位实在太大了。 使用slab带来以下几个好处: 减少了伙伴系统的访问次数,小内存的分配在sl 阅读全文
posted @ 2023-10-08 15:17 ZouTaooo 阅读(184) 评论(0) 推荐(0) 编辑
摘要:前言 页帧page是物理内存管理的基本单位,struct page记录了任意时刻page的所有状态,因此每一个物理页帧都需一个对应的struct page结构体记录状态,对于内存多计算机系统来说需要的struct page本身就需要大量内存进行存储,因此该结构体中每增加一个变量带来的代价会很大,需要 阅读全文
posted @ 2023-10-08 11:44 ZouTaooo 阅读(74) 评论(0) 推荐(0) 编辑
摘要:前言 在谈Linux内存管理框架之前需要了解NUMA,NUMA是非一致性内存访问(Uon-Uniform Memory Access)的缩写,与之相反的是一致性内存访问UMA。在多核的UMA架构的机器上,CPU视角下所有的内存都是均匀的,不同CPU访问同一块内存的延迟是相同;而在NUMA架构的机器上 阅读全文
posted @ 2023-10-08 11:27 ZouTaooo 阅读(114) 评论(0) 推荐(0) 编辑
摘要:前言 在伙伴系统中长时间的内存分配之后很容易造成内存碎片,即物理内存总量不少但是无法合并为大的连续内存块。而在现代CPU中提供了huge page的可能,可以分配超大块的page,在TLB中使用更少级的地址转换操作。一个page覆盖了更大的地址范围,大幅度的提高了TLB的命中概率。对于内存密集型应用 阅读全文
posted @ 2023-10-08 10:58 ZouTaooo 阅读(78) 评论(0) 推荐(0) 编辑
摘要:前言 在从伙伴系统进行内存分配时有一个__GFP_COMP分配flag,该flag表示从伙伴系统分配的连续页帧为一个复合页。复合页就是将多个页帧进行组合,视作一个更大size的页。 复合页可以用于hugetlb,减少tlb中地址转化的次数,减少tlb miss几率,同时提高tlb的地址转化速度。sl 阅读全文
posted @ 2023-10-08 10:28 ZouTaooo 阅读(143) 评论(0) 推荐(0) 编辑
摘要:前言 在进行内存访问时的大概流程如下: 由CPU发出访存指令 地址转化,MMU根据页表转换或者通过TLB得到物理地址 访问cache 如果cache miss,访问物理内存读入cache 因此,访问一个内容在cache中的物理内存能大幅度提高访问速度,基于这个原理,在Linux中将内容仍在cache 阅读全文
posted @ 2023-10-07 19:22 ZouTaooo 阅读(303) 评论(0) 推荐(0) 编辑
摘要:前言 伙伴系统的内存释放API分析,基于Linux 2.6.25。 对外封装的内存释放API分为两类,free_page和free_pages以虚拟地址为参数,__free_page和__free_pages以page指针为参数,可以使用virt_to_page实现虚拟地址到page指针的转化,最终 阅读全文
posted @ 2023-10-07 18:08 ZouTaooo 阅读(121) 评论(0) 推荐(0) 编辑
摘要:前言 伙伴系统实现了对页帧的管理,并对外提供分配和释放的接口。所有的上层内存分配,比如vmalloc、slab分配器等都是通过伙伴系统暴露的接口申请一个或者多个连续页帧。 伙伴系统常用封装API Linux内存管理的最上层包含多个Node,Node管理多个zone(DMA、NORMAL、HIGHME 阅读全文
posted @ 2023-10-07 18:08 ZouTaooo 阅读(53) 评论(0) 推荐(0) 编辑
摘要:前言 伙伴系统是Linux内存管理的精华部分,所有的物理内存管理使用的都是该机制。伙伴系统保障了内存分配的速度和效率,同时思想和实现又相当简单。这里对伙伴系统的结构进行简要的介绍。 伙伴系统结构 在zone中有一个成员free_area是伙伴系统的实现的关键部分,free_area是一个struct 阅读全文
posted @ 2023-10-07 18:07 ZouTaooo 阅读(63) 评论(0) 推荐(0) 编辑
摘要:前言 伙伴系统的内存分配API解析,基于Linux 2.6.25。 GFP_MASK GFP是get free page的缩写,GFP_MASK是一系列内存分配的掩码,指导伙伴系统寻找合适的内存块进行分配,同时在分配过程中按照掩码的指示进行内存相关的操作,比如内存回收、分配失败后的行为等。 以下四个 阅读全文
posted @ 2023-10-07 17:15 ZouTaooo 阅读(235) 评论(0) 推荐(0) 编辑
摘要:前言 ZONE_MOVABLE是一个虚拟内存域,ZONE_MOVABLE内存区域的范围实际上会覆盖高端内存或者NORMAL内存。 ZONE_MOVABLE有两个作用,其一是解决内存碎片问题,将内存域分为可移动和不可移动的(对于可移动和不可移动概念不清楚的可以先了解一下迁移类型以及已分配内存的类型划分 阅读全文
posted @ 2023-10-07 14:43 ZouTaooo 阅读(244) 评论(0) 推荐(0) 编辑
摘要:前言 参考《Linux内核源码情景分析》对缺页异常的处理过程,但是书中的kernel version版本较老,因此本文基于kernel version 4.19.20源码,对x86架构下的缺页异常,参考old version的内核源码剖析,再次进行了阅读。 缺页异常的产生原因 缺页异常就在通过虚拟地 阅读全文
posted @ 2023-06-02 17:35 ZouTaooo 阅读(383) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示
主题色彩