资讯动态

arch与linux目录下mm中的文件有何区别

发布时间:2026/8/5 3:03:58 来源:尧图企业网站定制
这两个目录最核心的区别在于代码的职责和抽象层次不同mm/目录放的是与硬件架构无关的通用逻辑而arch/*/mm/放的是为特定CPU架构如x86、ARM实现的底层硬件适配代码。简单说一个是“通用大脑”一个是“硬件手脚”。对比它们的差异特性mm/(通用内存管理)arch/*/mm/(架构相关内存管理)核心定位提供内存管理核心策略与框架如伙伴系统、SLUB分配器、页回收、KSM等。实现支撑通用框架所需的底层硬件操作如初始化页表、TLB管理、处理缺页异常。依赖关系不依赖任何具体CPU架构代码是平台无关的。深度依赖特定CPU比如ARM和x86处理页表的方式完全不同。典型功能管理虚拟内存、物理页分配、内存回收、swap、内存Cgroup等。初始化物理内存布局、设置MMU、处理特定架构的缺页异常、DMA地址转换。关键文件举例page_alloc.c(伙伴系统),slub.c(SLUB分配器),vmscan.c(页回收) 。fault.c(缺页处理),init.c(内存初始化),mmu.c(MMU设置)。如何协同工作这两部分代码通过定义良好的接口主要是struct page、pgd_t等标准数据结构来协作。以伙伴系统为例mm/page_alloc.c的__alloc_pages()函数想从伙伴系统申请一个物理页帧。当它需要将虚拟地址转换成物理地址或者决定在哪个NUMA节点上分配内存时它不会自己硬编码实现而是调用由arch/*/mm/提供的架构相关函数如virt_to_phys()、node_id()。arch/x86/mm/里的代码就会根据x86 CPU的页表格式和内存布局来实现这个地址转换逻辑。一个极端的例子当CPU没有MMU时arch/*/mm/的“硬件适配”作用在无MMU内存管理单元的处理器上体现得最为淋漓尽致。比如在ARM Cortex-M系列这类MCU上arch/arm/mm/目录下的代码行为会发生根本性变化nommu.c这个文件接管了内存管理它处理的是物理地址空间而不是虚拟地址空间。因为所有程序都运行在同一个物理地址空间里一个进程的指针错误就可能导致整个系统崩溃。简化功能因为没有MMU像vmalloc()这样分配虚拟地址连续、物理地址不连续内存的功能就无法实现通常会退化为简单的物理连续内存分配。架构接口的统一趋势内核社区一直在努力让各arch/*/mm/的实现更加统一以减轻维护负担。例如曾经不同架构识别物理内存布局的方式五花八门x86用e820ARM用memblock社区希望能统一这些接口。而且像free_area_init()这种初始化内存节点和zone的函数也正逐渐从各arch/*/mm/的代码中移出统一放到通用的mm/初始化流程中。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价