linux内存管理
文章平均质量分 77
cft56200_ln
格拉德韦尔在《异数》:并非天资超人一等,而是付出了持续不断的努力。只要经过1万小时的锤炼,任何人都能从平凡变成超凡”。要成为某个领域的专家,需要10000小时:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。
展开
-
Linux内存管理十四 vmalloc
走进vmalloc根据前面的系列文章,我们知道了buddy system是基于页框分配器,kmalloc是基于slab分配器,而且这些分配的地址都是物理内存连续的。但是随着碎片化的积累,连续物理内存的分配就会变得困难,对于那些非DMA访问,不一定非要连续物理内存的话完全可以像malloc那样,将不连续的物理内存页框映射到连续的虚拟地址空间中,这就是vmap的来源)(提供把离散的page映射到连续的虚拟地址空间),vmalloc的分配就是基于这个机制来实现的...转载 2021-05-28 10:43:17 · 324 阅读 · 0 评论 -
Linux内存管理十三 Linux slab分配器
在Linux中,伙伴系统是以页为单位分配内存。但是现实中很多时候却以字节为单位,不然申请10Bytes内存还要给1页的话就太浪费了。slab分配器就是为小内存分配而生的。slab分配器分配内存以Byte为单位。但是slab分配器并没有脱离伙伴系统,而是基于伙伴系统分配的大内存进一步细分成小内存分配。走进slub...转载 2021-05-28 10:34:55 · 523 阅读 · 0 评论 -
Linux内存管理十二 Linux进程的内存管理之缺页异常
通过《Linux进程的内存管理之malloc和mmap》我们知道,这两个函数只是建立了进程的vma,但还没有建立虚拟地址和物理地址的映射关系。当进程访问这些还没建立映射关系的虚拟地址时,处理器会自动触发缺页异常。ARM64把异常分为同步异常和异步异常,通常异步异常指的是中断(可看《上帝视角看中断》),同步异常指的是异常。关于ARM异常处理的文章可参考《ARMv8异常处理简介》。...转载 2021-05-28 10:06:29 · 580 阅读 · 0 评论 -
Linux内存管理十一 malloc和mmap
通过《Linxu进程的内存管理》,我们知道了进程内存的最小单位是vma,根据不同的用处又划分了不同类型的vma,比如 heap: 动态分配和释放的内存 stack: 存放局部变量和实现函数调用 mmap:文件区间映射到虚拟地址空间的内存映射 text,data,bss 这篇我们就看下进程动态申请的内存,我们知道进程动态申请内存的函数是malloc,这篇讲下其涉及到的vma,即heap和mmap。malloc在linux标准libc库种,malloc函数的...转载 2021-05-28 09:24:56 · 706 阅读 · 0 评论 -
Linux内存管理十 如何让Linux进程在固定堆运行
我们知道程序在每次运行的时候地址都是不一样的,linux之所以有这样的设计也许是为了安全性考虑,不利于黑客的攻击。我们看一个简单的程序:#include <stdio.h>#include <stdlib.h>int main(int argc, char* argv[]){ int first = 0; int *p = malloc(1024); printf("p=%p\n", p); return 0;}显然程序每转载 2021-05-27 17:27:33 · 177 阅读 · 0 评论 -
Linux内存管理之九 内存管理
几个关键的数据结构一个进程的虚拟地址空间主要由两个数据结来描述,一个是 mm_struct,一个是 vm_area_structs。 mm_struct结构描述了一个进程的整个虚拟地址空间,vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。下图就是我们所说的由task_struct到mm_struct,进程的地址空间的分布。 每一个进程都会有自己独立的mm_struct,这样每一个进程都会有自己独立的地址空间,这样才能互不干扰。当进程之间的地址空间被共享的时候,我们可以转载 2021-05-27 17:23:17 · 115 阅读 · 0 评论 -
Linux内存管理之八 Linux页框分配器之内存碎片化整理
页框分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下:static inline struct page *__alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, struct alloc_context *ac){ page = __alloc_pages_direct_compact(gfp_mask, order, alloc_flags, ac, INIT_COMPACT_PRI转载 2021-05-27 17:12:06 · 272 阅读 · 0 评论 -
Linux内存管理之七 Linux分区页框分配器之水位
我们讲页框分配器的时候讲到了快速分配和慢速分配,其中伙伴算法是在快速分配里做的,忘记的小伙伴我们再看下:static struct page *get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,const struct alloc_context *ac){ for_next_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high转载 2021-05-27 16:56:38 · 586 阅读 · 0 评论 -
Linux内存管理之六 Linux页框分配器之伙伴算法
上文我们讲到快速分配和慢速分配,接下来会详细讲解这两种分配情况,我们先来看下快速分配:static struct page *get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags, const struct alloc_context *ac){ for_next_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_z转载 2021-05-27 16:20:50 · 311 阅读 · 0 评论 -
Linux内存管理之五 Linux分区页框分配器
我们现在知道物理内存是以页框为最小单位存在的,那么内核中分配页框的方法是什么呢?分区页框分配器页框分配在内核里的机制我们叫做分区页框分配器(zoned page frame allocator),在linux系统中,分区页框分配器管理着所有物理内存,无论你是内核还是进程,都需要请求分区页框分配器,这时才会分配给你应该获得的物理内存页框。当你所拥有的页框不再使用时,你必须释放这些页框,让这些页框回到管理区页框分配器当中。有时候目标管理区不一定有足够的页框去满足分配,这时候系统会从另外两个管理区中获转载 2021-05-27 13:48:39 · 316 阅读 · 0 评论 -
Linux内存管理之四 数据结构
学习内存管理之前我们先了解几个重要的结构体,这些结构体理解了,基本对内存管理也就理解了一半。我说的。struct zone { unsigned long watermark[NR_WMARK]; struct pglist_data *zone_pgdat; struct per_cpu_pageset __percpu *pageset; struct free_area free_area[MAX_ORDER]; ......}enum zone_watermarks转载 2021-05-27 11:29:39 · 201 阅读 · 0 评论 -
Linux内存管理之一 CPU是如何访问内存的?
内存管理可以说是一个比较难学的模块,之所以比较难学。一是内存管理涉及到硬件的实现原理和软件的复杂算法,二是网上关于内存管理的解释有太多错误的解释。希望可以做个内存管理的系列,从硬件实现到底层内存分配算法,再从内核分配算法到应用程序内存划分,一直到内存和硬盘如何交互等,彻底理解内存管理的整个脉络框架。本节主要讲解硬件原理和分页管理。CPU通过MMU访问内存我们先来看一张图:从图中可以清晰地看出,CPU、MMU、DDR 这三部分在硬件上是如何分布的。首先 CPU 在访问内存的时候都需要通过 MM转载 2021-05-27 10:06:11 · 650 阅读 · 0 评论 -
Linux内存管理之二 MMU的过程
之前写过一篇《CPU是如何访问内存的?https://mp.weixin.qq.com/s?__biz=MzIxMjE1MzU4OA==&mid=2648919485&idx=1&sn=5b9281e427829634373a638bf0be1c89&chksm=8f5d8826b82a0130fb7e604c344de9d17436ccf51c1ab35a6c32c5b4dd80db7ea6ac7b534594&scene=21#wechat_redirect》的文转载 2021-05-27 10:28:29 · 250 阅读 · 0 评论