Linux内存管理:flags详解与内存分配

需积分: 16 1 下载量 95 浏览量 更新于2024-09-03 收藏 351KB PDF 举报
该文档是关于Linux内存管理的FAQs,涵盖了内存管理中的各种flags,包括物理page的flags、内存块的pageblock_flags、分配内存时的gfp flags以及SLAB缓存创建时的kmem_cache_create函数所用的SLAB flags。此外,还讨论了页表的pte flags、vmalloc区域和内存映射区的flags,以及物理页帧和页表的分配时机。文档还提到了CONFIG_HIGHMEM配置与物理内存大小的关系。 在Linux内存管理系统中,flags扮演着至关重要的角色: 1. **物理Page的flags**:每个物理页面有自己的flags,存储在struct page结构体的unsigned long flags字段中。这些标志用于标记页面的状态,如是否被映射、是否可写、是否锁定等,具体细节可以在2.2.2节的《page》部分找到。 2. **内存块的pageblock_flags**:内存块由多个页面组成,其flags存储在struct zone结构体的unsigned long *pageblock_flags中,用于管理内存块的特性,如是否为空、是否可分配等,详细信息可在2.4.3节的《辅助函数与变量》查阅。 3. **gfp flags**:在申请内存时,需要指定gfp flags,这些标志控制内存分配的策略,例如是否允许等待、是否可以使用高端内存等,更多内容可在2.4.5节的《分配掩码GFP_XXX》查看。 4. **SLAB flags**:kmem_cache_create函数用于创建缓存,其中会涉及到SLAB flags,这些标志用于定制缓存的行为,如预分配、填充策略等,2.5.3节《APIs》中对此有详细介绍。 5. **页表的pte flags**:页表条目(pte)的低阶位可以用于存储保护,例如设置读/写权限,这部分在3.1.1节的《pteflags》中讨论。 6. **vmalloc区域和内存映射区的flags**:vm_struct和vm_area_struct结构分别表示vmalloc区域和内存映射区的子区域,它们各自的flags用于控制和标识这些区域的特性,如匿名映射、私有/共享等,相关细节分别在3.2.4节《vm_struct》和3.3.4节《子区域(vm_area_struct)》中。 7. **物理页帧和页表的分配**:创建新内存映射时,通常不会立即分配物理页帧和创建页表,而是在尝试访问未映射的虚拟地址时触发缺页异常,此时内核才会进行分配和建立页表。但若使用了MAP_LOCKED标志或堆扩展时,会预先触发缺页异常,确保物理页帧和页表的准备就绪。 8. **CONFIG_HIGHMEM与物理内存大小**:CONFIG_HIGHMEM配置决定是否支持高端内存。如果物理内存较小,即使不启用CONFIG_HIGHMEM,系统也可能不存在高端内存。反之,如果物理内存较大但未启用此配置,内核将无法使用超出线性映射范围的内存。 Linux内存管理涉及多方面的复杂机制,flags作为控制这些机制的关键元素,确保了内存的有效分配、管理和保护。理解这些flags及其作用对于优化系统性能和解决内存相关问题至关重要。