
内存管理
文章平均质量分 92
Truman楚门
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux的页表管理
本文摘要: Linux内存管理机制解析,重点介绍了物理帧号(PFN)与页表结构的关系。32位系统使用二级页表(PDE-PTE),64位系统使用四级页表(PGD-PUD-PMD-PTE)。文章详细阐述了页错误(Page Fault)的触发机制与处理流程,包括内核页表init_top_pgt的初始化过程。同时分析了进程切换时页表更新的机制,指出内核通过clone_pgd_range将部分内核页表(273-511项)拷贝到用户进程页表,既保证内核页表不变,又防止用户空间越界访问内核区域。最后对比了32位与64位系原创 2025-08-14 14:36:17 · 532 阅读 · 0 评论 -
Per-CPU pages
这些缓存在pcp中的页框,若释放到free_area中则可能可以与其它页框合并成order更高的内存块,从而减少系统的内存碎片。PS: 通过per_cpu_ptr(zone->per_cpu_pageset, cpu_x);得到一个指针,指向cpu_x的那个struct per_cpu_pages空间。(1)为每个zone调用setup_zone_pageset分配并初始化per_cpu_pageset。(2)初始化每个cpu的struct per_cpu_pages的每个变量, 这里是给每个变量都赋0。原创 2025-08-11 16:24:16 · 795 阅读 · 0 评论 -
Linux中vmalloc的实现
本文分析了Linux内核中vmalloc的实现机制。vmalloc用于在内核空间分配虚拟连续但物理不连续的内存,其核心流程包括:1)通过__get_vm_area_node在vmalloc区域查找可用虚拟地址,使用红黑树管理vmap_area结构;2)通过__vmalloc_area_node从buddy系统分配物理页,建立页表映射;3)处理缺页异常时,通过vmalloc_fault将init进程的页表项复制到当前进程。该机制通过init_mm共享内核页表,实现了进程间内核地址空间的同步。原创 2025-08-11 16:38:52 · 931 阅读 · 0 评论 -
kmalloc
摘要:kmalloc是Linux内核中用于分配小块连续内存(≤4K)的核心机制,底层依赖slab(小内存)或buddysystem(大内存)。其分配策略为:≤8K从slab分配(预定义kmalloc_caches管理不同尺寸的slab,如8B~8K),>8K则直接调用buddysystem(最大支持4M)。内存地址通过内核启动时已建立线性映射(PA=VA-FixedOffset)。实现上,kmalloc通过编译优化区分常量/非常量请求,最终调用___kmalloc_large_node(buddysyst原创 2025-08-11 16:30:33 · 958 阅读 · 0 评论 -
Slub(Slab)
本文摘要: Linux内核SLUB内存分配器是对SLAB的改进版本,采用分层管理结构。核心数据结构包括kmem_cache(描述缓存池)、kmem_cache_cpu(CPU本地缓存)、kmem_cache_node(NUMA节点缓存)和slab(内存页管理单元)。SLUB采用两级回收机制(CPU级和Node级),通过freelist实现快速分配。当本地CPU缓存不足时,会依次检查partial链表和伙伴系统获取内存。调试特性包括红区检测和kfence工具。关键函数kmem_cache_create/all原创 2025-08-11 16:28:58 · 783 阅读 · 0 评论 -
Buddy system
Linux引入了伙伴算法(buddy system)来解决内存外碎片问题。该算法将物理内存划分为2^n大小的块,并按大小组织成不同阶(order)的链表。分配时,先查找合适阶的链表,若没有则从高阶分割出所需块;释放时,会检查相邻空闲块是否为伙伴关系,是则合并成高阶块。核心数据结构free_area数组管理各阶空闲链表,通过__rmqueue_smallest等函数实现分配,释放时通过合并减少碎片。算法还支持不同迁移类型(MIGRATE_TYPES)的内存管理,并包含fallback机制处理分配失败情况。原创 2025-08-11 16:19:19 · 894 阅读 · 0 评论 -
Linux内核对物理内存组织与分配
Linux物理内存管理采用分层结构:NUMA架构下引入node概念,每个node对应一个物理内存节点,由pglist_data结构表示。node进一步划分为多个zone(如DMA、NORMAL等),由zone结构描述。物理内存以page为单位管理,通过mem_map全局数组跟踪所有页框。Linux采用四种机制管理不同粒度的内存分配:伙伴系统处理大块连续内存(>32K),per-CPU页缓存优化小内存分配(≤32K),slab缓存管理小块对象(<4K),vmalloc机制提供虚拟连续的内存空间。这原创 2025-08-11 16:12:37 · 770 阅读 · 0 评论 -
Cache和内存一致性
本文主要探讨缓存一致性与内存一致性的区别。内存(DIMM)是物理存储设备,而缓存(CPU芯片内的L1-L3)是高速暂存区,采用分级结构。缓存一致性通过MESI协议(四种状态)确保多核CPU访问同一数据时的正确性,分为Snooping和Directory两种模式。内存一致性则涉及NUMA架构,解决多处理器访问内存的性能问题,其中cc-NUMA在NUMA基础上支持缓存一致性。文章详细对比了二者的工作原理和实现机制,帮助理解计算机系统中的这两种重要一致性概念。原创 2025-08-11 16:02:41 · 450 阅读 · 0 评论