- 博客(64)
- 资源 (1)
- 收藏
- 关注
原创 [内核内存] page cache
文章目录page cache 和 buffer cachepage cache带page cache的文件读写基本流程(转)读文件写文件小结page cache 和 buffer cachelinux在I/O的过程中,磁盘读写数据的速度远远低于内存读写数据的速度。因此为了加快内存处理磁盘数据的速度,linux将从磁盘中读取的数据缓存到内存的某一空闲区域。这些缓存磁盘数据的内存区域被称为缓冲区。在linux不支持虚拟内存机制前linux不存在页的概念,内存读取磁盘数据以设备块为单位,因而linux I/
2021-06-23 17:24:50 2086 1
翻译 系统存储分层设计(The Memory Hierarchy)
今天看到一个比较优秀的博文,主要是讲解内存层次结构设计的(The Memory Hierarchy ),里面对高速cache的设计思路讲解个人认为不叫牛逼,记录下博文链接:http://www.wowotech.net/basic_subject/memory-hierarchy.html.同时博文中推荐的书籍:COMPUTER SYSTEMS也是值得我们去翻翻。...
2021-06-10 16:49:32 354
翻译 [用户态内存] linux用户态内存检测技术
文章目录1 ASANASAN使用方法和实例ASAN使用方法ASAN实例ASAN实现原理ASAN性能影响2 ValgrindValgrind工具的交叉编译Valgrind工具使用方式Valgrind内存检测功能Valgrind工具内存检测实例内存越界访问和内存泄露检测实例1 ASANASAN(Address Sanitizer)是一款面向C/C++语言的内存错误问题检查工具,这些工具只能检测用户空间的内存问题。ASAN可以对用户态程序的如下内存问题进行检测:使用已释放内存(野指针)堆内存越界(读写)
2021-05-19 18:05:26 934
原创 [内核内存] linux内核态内存检测技术
文章目录1 slub_debug**内核配置****slabinfo工具编译****系统加载内核启动参数 ****功能****实例****右越界访问:****slub_debug实现原理**linux常见的内存错误访问:越界访问(out of bounds)访问已经释放的内存(use after free)重复释放内存泄露(memory leak)栈溢出(stack overflow)a. 对于内核内存泄露问题--->kmemleak工具b. 对越界访问,重复释放,栈溢出和访问已
2021-05-19 17:35:16 1887
翻译 [用户态内存] linux用户态内存池
总结归纳中,后续更新。。。推荐博文:https://zhuanlan.zhihu.com/p/356091561
2021-05-18 15:17:13 304
原创 [用户态内存] linux用户态常见的内存分配函数
文章目录1 malloc1.1 malloc函数基本功能1.2 malloc实现原理(转)1.3 malloc支持多线程2 mmap2.1 mmap原理2.2 mmap映射分类2.3 mmap函数使用2.3.1 参数介绍2.3.2函数返回值2.3.3 函数mmap使用细节和场景分析2.3.3.1 mmap使用细节:2.3.3.2 mmap函数场景分析:1 malloc1.1 malloc函数基本功能#include <malloc.h> //或 #include <alloc.h&g
2021-05-17 21:46:52 1105 2
原创 [内核内存] linux内核态中常见的内存分配函数
文章目录1 alloc_pages2 vmalloc3 kmem_cache_alloc4 kmalloc5 dma_alloc_coherent6 ioremap1 alloc_pagesalloc_pages用于申请一块2^order的连续物理内存块,适用于分配较大量的连续物理内存.详情参考以前的文章:arm64 Linux内核内存伙伴系统4—alloc_pages(内存块分配)2 vmallocvmalloc是一个接口函数, 内核代码使用它来分配在虚拟内存中连续但在物理内存中不一定连续的内存。
2021-05-17 19:29:12 1128
原创 [内核内存] 用户态进程虚拟内存管理
文章目录1.linux 用户态进程虚拟地址空间1.1 arm32 用户进程的虚拟地址空间1.2 arm64架构用户态虚拟地址空间.2.linux用户态进程虚拟地址空间管理2.1.进程描述符task_struct2.2.进程用户态虚拟地址空间描述符3.用户态进程的虚拟地址和物理地址的映射管理4.linux用户态进程文件页的虚拟地址如何对应到磁盘中文件的具体位置?1.linux 用户态进程虚拟地址空间在linux多任务操作系统中,每个用户态进程都有自己的虚拟地址空间,用户态进程虚拟地址空间主要分内核虚拟地址
2021-05-17 16:29:46 1066
原创 [内核内存] [mem_cgroup] cgroup内存子系统详解
该板块后续更新!!!!!相关资源:https://www.cnblogs.com/lisperl/tag/%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF/
2021-05-14 10:08:55 511
翻译 [用户态内存] 共享内存3---SYS V共享内存
文章目录1.SYS V共享内存2.SYS V共享内存操作流程2.1 SYS V共享内存区域的创建2.2 映射SYS V共享内存映射2.3 共享内存相关操作2.4 解除SYS V共享内存映射3. SYS V 共享内存实例3.1 父子进程间SYS V共享内存通信3.2 非血缘关系进程间SYS V共享内存通信4.shell终端操作System V共享内存1.SYS V共享内存System V 的IPC对象有共享内存、消息队列、信号量。本文介绍System V共享内存。Systm V IPC机制下的共享内存
2021-05-08 16:20:25 375
翻译 [用户态内存] 共享内存2---Posix共享内存
文章目录1.Posix 共享内存概念2.Posix 共享内存关键函数2.1 shm_open()函数2.2 mmap函数3.Posix实例3.1 父子进程间Posix共享内存通信3.2 非血缘关系进程间Posix共享内存通信1.Posix 共享内存概念Posix 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列A
2021-05-08 16:16:41 819
翻译 [用户态内存] 共享内存1---tmpfs和ramfs
文章目录1.ramfs2.tmpfs3 ramfs和tmpfs性能对比和异同1.ramfsramfs是Linux下一种基于RAM做存储的文件系统,由于ramfs的实现就相当于把RAM作为最后一层的存储,所以在ramfs中不会使用swap。linux os看ramfs就像看普通硬盘一样,所以ramfs有一个较大缺陷就是它会吃光os的内存,哪怕你在mount时已经指定了该ramfs的大小。由于上述缺陷,ramfs只能root用户访问。ramfs创建mkdir -p /dev/myRamFsmount
2021-05-08 16:11:44 1225
原创 [内核内存] slab分配器4---kmem_cache_init_late函数源码详解
slab系统初始化过程中,待所有cpu都完成初始化后,通过调用kmem_cache_init_late来函数完善cache_chain上每个struct kmem_cache实例的cpu缓存机制(包括cpu本地高速缓存和每个节点上的cpu共享缓存shared cache)kmem_cache_init_late() |---list_for_each_entry(cachep, &slab_caches, list)//遍历slab_caches全局链表中每个struct kmem_cache实
2021-05-08 10:30:23 337
原创 [内核内存] slab分配器3---kmem_cache_init函数源码详解
kmem_cache_init函数源码详解//mm/slab.c/* * Initialisation. Called after the page allocator have been initialised and * before smp_init(). *slab系统初始化时伙伴系统已经初始化,但在多处理器系统上,启动CPU此时正在运行, 而其他CPU尚未初始化. */void __init kmem_cache_init(void){ int i; BUILD_BUG_O
2021-05-08 10:24:46 709
原创 [内核内存] slab分配器2---slab系统初始化
文章目录1 slab系统初始化---kmem_cache_init&&kmem_cache_init_late2 kmem_cache实例中cpu本地高速缓存和 kmem_cache_node实例中共享高速缓存间的关系2.1 本地cpu高速缓存(cpu_cache)和cpu共享高速缓存(shared_cache)间的交互关系2.2 shared cache引入原因3.3 slab系统中特殊结构体内存分配3.3.1 创建对应数据结构的slab cache描述符3.3.2 分配slab obj3
2021-05-08 10:16:38 749
原创 [内核内存] slab分配器1---slab机制详解
文章目录1 slab分配器原理2 slab分配器重要数据结构以及组织关系2.1 slab cache描述符struct kmem_cache2.2 slab描述符struct page3.slab分配器中各个重要结构体间的关系总结linux中的伙伴系统内存分配器是以页(4k)为最小粒度来进行内存分配。在实际的应用中,内核存储的大多数obj(如strcut task_strcuct,struct inode等数据结构)往往只需要几字节到几百字节不等。如果这些内核object的内存申请和释放都通过伙伴系统进行
2021-05-08 09:59:12 5395 3
原创 [内核内存] 反向映射详解
文章目录1 匿名页反向映射1.1 匿名页反向映射关键数据结构1.2 linux匿名页的反向映射机制1.3 进程创建时反向映射相关结构体间的关系1.4 linux为匿名页的VMA分配AV的流程do_anonymous_page函数(缺页异常匿名页处理方式)anon_vma_prepare函数(关联匿名页的VMA和AV)page_add_new_anon_rmap函数(关联匿名页描述符struct page和AV)1.5 linux子进程创建时匿名页的写时复制(COW)机制2 文件页反向映射3 KSM页面反向映
2021-05-06 17:00:47 3480
原创 [内核内存] [arm64] 内存回收5---add_to_swap函数详解
add_to_swap函数是为匿名页面分配交换空间.当对一个匿名页面page进行内存回收时,若该匿名页面page具有如下状态1.该匿名页未被用户应用访问.(映射该匿名页的所有pte页表项的AF位为0)2.PageAnon(page) && !PageSwapCache(page)为true.(该page未被分配swap空间)若此时页面回收则允许页面进行文件操作或磁盘I/0操作(sc->gfp_mask & __GFP_IO为true).则页面回收则会调用add_to_
2021-04-30 12:56:54 678
原创 [内核内存] [arm64] 内存回收4---shrink_node函数详解
文章目录1 shrink_node函数1.1 shrink_node_memcg1.1.1 get_scan_count函数1.1.2 shrink_list函数1.1.2.1 inactive_list_is_low函数1.1.2.2 shrink_active_list函数1.1.2.3 shrink_inactive_list函数1.1.2.3.1页面回收核心函数shrink_page_list匿名页回收流程文件页回收流程1.2 shrink_slab函数1 shrink_node函数shrink
2021-04-29 23:21:42 2865
原创 [内核内存] [arm64] 内存回收3---kswapd内核线程回收
文章目录1.kswapd线程初始化2.kswapd线程的唤醒3.kswapd线程源码分析3.1 kswapd函数alloc_order,reclaim_order和classzone_idx局部变量解析kswapd_try_to_sleep函数balance_pgdat函数kswapd_shrink_node函数3.kswapd执行流程总结1.kswapd线程初始化kswapd是linux内核中一个用于在内存不足的情况下进行内存回收线程。该线程的初始化函数为kswapd_init。由下代码可知,内核会给
2021-04-29 22:38:13 1555
原创 [内核内存] [arm64] 内存回收2---快速内存回收和直接内存回收
文章目录内存紧张回收快速内存回收struct scan_control结构体__node__reclaim函数介绍快速内存回收注意事项和小结直接内存回收__perform_reclaim函数try_to_free_pages函数throttle_direct_reclaim函数allow_direct_reclaim函数do_try_to_free_pages函数shrink_zones直接内存回收注意事项和小结当linux kernel内存不足时,都需要回收一些最近很少使用的页面保证linux内核能持续
2021-04-29 22:32:42 1995 2
原创 [内核内存] [arm64] 内存回收1---LRU链表机制
文章目录LRU机制与linux内存回收linux 内存回收引入 LRU链表的原因linux通过LRU链表筛选出理想的回收页框原理linux LRU缓存机制linux内核LRU实现LRU链表拆分原理分析LRU链表内核代码实现对于linux内存回收来说,lru链表是关键,因为内存回收的整个过程都是处理lru链表的收缩。lru链表的作用就是对进行页排序,将应该回收的页放在链表尾部,最不该回收的页放在链表头部;内存回收主要是将lru链表中最近很少访问的尾部页框内容从内存转储到磁盘中,然后将转储后的页框释放到伙伴系
2021-04-26 11:14:18 923
原创 [内核内存] [arm64] 内存规整2---页间内容的迁移(__unmap_and_move函数)
本文将前面内存规整流程中一个重要函数__unmap_and_move进行详细分析,该函数定义如下static int __unmap_and_move(struct page *page, struct page *newpage, int force, enum migrate_mode mode)该函数作用是进行单页的迁移操作:将page页的内容和状态迁移到新页newpage中去,主要实现思路如下所示(具体处理细节参考下面的源码分析):1.先对被迁移的页page上锁,置位PG_locke
2021-04-25 21:31:13 643
原创 [内核内存] [arm64] 内存规整1---memory-compaction详解
typora-root-url: 图片文章目录1.memory-compaction简介2.memory-compaction调用流程3.memory-compaction源码分析3.1内存规整关键数据结构3.2struct zone中与内存规整相关的成员3.3内存规整扫描zone的基本单位pageblock3.4 fragmentation index(碎片指数)3.5__alloc_pages_direct_compact函数3.5.1compaction_deferred函数(内存规整推迟机制).
2021-04-25 20:49:26 1147
原创 [内核内存] [arm64] zone区域的水线值(watermark)和保留内存值(lowmem_reserve)详解
文章目录1 watermark简介2 watermark相关结构体3 watermark初始化3.1 managed_pages,spanned_pages,present_pages三个值对应的意义3.2 什么是min_free_kbytes3.3 Watermark的low,min和high这3档位初始化3.3.1 内存水线初始化过程分析3.3.2 内存水线初始化内核代码分析init_per_zone_wmark_min函数nr_free_buffer_pages函数setup_per_zone_wma
2021-04-21 20:01:15 5090
原创 [内核内存] [arm64] 内存相关的小知识点
文章目录知识点大杂烩zone->percpu_drift_mark伙伴系统相关知识点大杂烩zone->percpu_drift_mark该值初始化函数:mm/page_alloc.c:init_per_zone_wmark_min->refresh_zone_stat_thresholds()常规条件下zone区域的free_pages获取方式如下所示:free_pages = atomic_long_read(zone->vm_stat[NR_FREE_PAGES
2021-04-21 19:34:04 701
原创 [内核内存] [arm64] 内存相关的常用proc接口
文章目录zone水线相关proc接口ZONE保留内存相关proc接口这些proc接口主要在arm64 linux4.9版本操作系统下验证过.zone水线相关proc接口#查看或手动设置min_free_kbytes值,控制zone区域min水线值/proc/sys/vm/min_free_kbytes#该值可以控制zone区域low和highg水线值,会根据zone实际内存比例来调节两个水线值,调节更加灵活/proc/sys/vm/watermark_scale_factorZONE保留内
2021-04-21 19:24:50 406
原创 [内核内存] 伙伴系统---相关知识点
文章目录1 如何根据gfp flag找到对应的zone2 linux zone分块管理引入migrate_type缘由分析3 MIGRATE_HIGHATOMIC迁移类型页面4.PF_MEMALLOC标志位5 ZONE_MOVABLE引入分析1 如何根据gfp flag找到对应的zone当内核分配内存时,需要指定gfp flag, 内核通过gfp标志判断从哪个zone分配内存如:alloc_pages(gfp_mask, order),而在linux中存在ZONE_DMA, ZONE_DMA32, ZO
2021-04-20 19:36:13 823 1
原创 [内核内存] 伙伴系统7---__free_pages(页块释放)
文章目录__free_pages__free_pages_ok多页释放函数free_one_page函数__free_one_page函数__find_buddy_indexif (max_order < MAX_ORDER)引入目的释放页加入伙伴系统实例演示参考__free_pageslinux内核中伙伴系统内存释放函数间的调用关系可用下图来表述代码//释放一个页,传入参数是页框首地址的虚拟地址#define free_page(addr) free_pages((addr), 0)
2021-04-20 19:17:34 2012
原创 [内核内存] 伙伴系统4---alloc_pages(内存块分配)
文章目录alloc_pages源码流程分析alloc_pages函数实现流程代码细节分析**参数准备****核心函数__alloc_pages_nodemask**快速内存分配(get_page_from_freelist)get_page_from_freelist流程图get_page_from_freelist代码实现细节慢速内存分配(\_\_alloc_pages_slowpath())\_\_alloc_pages_slowpath函数流程图\_\_alloc_pages_slowpath代码实现
2021-04-19 20:37:45 3142 1
原创 [内核内存] 伙伴系统3---初始化
文章目录1.初始化与伙伴系统相关的数据结构2.将memblock管理的内存空间释放到伙伴系统中去2.1 reserve_bootmem_region函数2.2 __free_memory_core函数伙伴系统初始化涉及两个方面:1.初始化与伙伴系统相关的数据结构,2.将memblock管理的内存空间释放到伙伴系统中去.1.初始化与伙伴系统相关的数据结构对于伙伴系统相关数据结构的初始化,在以前介绍的linux内核内存初始化时就基本完成,主要包括内存节点中以下几个方面的初始化:每个zone区域的fre
2021-04-17 21:57:08 771
原创 [内核内存] 伙伴系统2---基本原理
Linux系统中经常需要分配一组连续的内存块。当重复地申请和释放不同大小的连续内存块后,会导致系统内存在已经分配的的页块周围分布着许多不连续的空闲内存块。这样即使系统中空闲的页框还有很多,但是当系统需要分配一块较大的连续内存块时内存管理模块很难去提供。这就是老大难的内存碎片化的问题。为了避免内存的碎片化问题,linux引入了伙伴系统算法。伙伴系统是一个高效且简单的内存分配策略。当我们找到了待分配内存的zone后,内核将从对应zone的空闲链表中去分配内存。在释放内存时,内核有将相应的内存还回对应zone
2021-04-15 17:13:33 741
原创 [内核内存] 伙伴系统1---相关结构体介绍
文章目录1.伙伴系统相关结构体2.zone的free_area成员3.gfp_mask4.ALLOC\_XXX分配标志5.struct alloc_contest内核启动前期物理内存是由memblock来管理比如内存申请和释放操作,可以将membloc当做早期的内存分配器。当内核内存初始化完成后内存的管理工作交接给伙伴系统。Buddy System是基于页面的内存分配器,它管理struct page结构。由前面的介绍内容可知:(1)struct page结构与物理内存的对应关系是由内存模型决定的(spar
2021-04-15 17:03:27 661
原创 [内核内存] [arm64] 内存初始化(汇总)
下面对linux内核内存初始化流程进行一个汇总,部分函数还未解读,后续会更新(arm64架构,sparse内存模型)://汇编代码运行节点stext |--->__create_page_tables:该函数主要完成linux内存中两块内存区域的页表创建和出事化: (1):把idmap_text区域的物理地址映射到相等的虚拟地址上,并创建初始化相关页表. 这种映射完成后,其虚拟地址等于物理地址。idmap_text区域都是一些打开MMU
2021-04-14 22:15:39 1485
原创 [内核内存] [arm64] 内存初始化5---build_all_zonelists
细心的读者可能会发现bootmem流程中每个节点strcut pglist_data构体中的strcut zonelist node_zonelists[]成员还未进行初始化。实际上这些操作是通过start_kernel函数中的build_all_zonlists函数来完成的。在分析该函数前可通过下面链接的博客了解一下备选节点的概念:http://blog.chinaunix.net/uid-30282771-id-5171166.htmlbuild_all_zonlists函数主要是为node创建一个内
2021-04-12 21:29:40 472
原创 什么函数不能申明为虚函数
只需要记住可以声明成虚函数的就行!(普通的成员函数或析构函数)虚函数的使用原则:可以把public或protected的部分成员函数声明为虚函数;其他特别的函数不能被申明为虚函数的原因:1.普通函数(不能被覆盖)2.友元函数(C++不支持友元函数继承)3.内联函数(编译期间展开,虚函数是在运行期间绑定)4.构造函数(没有对象不能使用构造函数,先有构造函数后有虚函数,虚函数是对
2021-04-12 17:13:29 163
原创 [内核内存] [arm64] 内存初始化4---bootm_init
linux内核版本:linux4.9.115(arm64)文章目录1.bootmem_init()2.arm64_memory_present3.sparse_init4.zone_sizes_initfree_area_init_nodefree_area_init_corearm64_memblock_init()完成了memblock的初始化然后通过paging_init建立只能用于内核的页表开始初始化分页机制。分页机制完成后内核则需要通过bootmem_init函数开始进行内存基本数据结构的初始
2021-04-12 16:53:41 1406
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人