news 2026/4/15 18:26:42

Linux 内存管理:MMU 寻址过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 内存管理:MMU 寻址过程

文章目录

  • 1. 前言
  • 2. 概述
    • 2.1 两级分页
    • 2.2 三级分页
  • 3. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 概述

本文以Linux 4.14.xARMv7架构下,分别对两级三级分页进行讨论。

在讨论之前,先假定4G虚拟地址空间按1G:3G划分,中断向量位于4G虚拟地址最高地址位置(Vector High),一如下图:

2.1 两级分页

在没有启用LPAE(Large Physical Address Extension)功能的情形下,内核最多使用两级分页进行寻址。注意,这里的最多表示:有些情形下可以一级分页,两级分页是上限

先上图,Linux 下两级分页寻址过程如下:

仅用到TTBR0来存储第一级页表物理基址,用来进行page table walk,其值初始在__enable_mmu中设置,后续会随着进程切换变化;而TTBR1仅用来备份内核页表 swapper_pg_dir的物理地址,其值在proc-v7-2level.S:v7_ttb_setup中设置,在切换页表期间临时拷贝覆盖TTBR0,避免非法的地址访问。

来简单看一下上图形成的过程。先看TTBR0,TTBR1初始化过程:

__v7_ca7mp_setup:...__errata_finish:mov r10,#0...#ifdefCONFIG_MMU.../* * r10 = 0 * r8 = 内核页表 swapper_pg_dir 物理基址 */v7_ttb_setup r10,r4,r5,r8,r3 @ TTBCR,TTBRx setup...#endif
.macro v7_ttb_setup,zero,ttbr0l,ttbr0h,ttbr1,tmp// TTBCR = 0mcr p15,0,\zero,c2,c0,2@ TTB controlregisterALT_SMP(orr \ttbr0l,\ttbr0l,#TTB_FLAGS_SMP)// \ttbr0l |= TTB_FLAGS_SMP (r4 |= TTB_FLAGS_SMP)...ALT_SMP(orr \ttbr1,\ttbr1,#TTB_FLAGS_SMP)// \ttbr1 |= TTB_FLAGS_SMP (r8 |= TTB_FLAGS_SMP)...// TTBR1 = swapper_pg_dir 页表物理地址mcr p15,0,\ttbr1,c2,c0,1@ load TTB1.endm

BOOT CPUTTBCR,TTBR0,TTBR1从初始化如上分析。注意,MMU每 CPU的,那自然TTBCR,TTBR0,TTBR1也是每 CPU的。在非BOOT CPU上,除了TTBR0初始为idmap_pgd的物理地址外,TTBR1仍然初始化为swapper_pg_dir页表物理地址,这里就不做展开了。

再简单看下内核lowmem的映射建立(包括内核镜像区间):

start_kernel()setup_arch()paging_init()map_lowmem()

map_lowmem()建立了lowmem的页表映射,内核区间用1MB section大小进行映射,只使用了一级映射(正如前面提到的)。

接下来看下进程第一级页表的创建

copy_process()copy_mm()dup_mm()mm_init()mm_alloc_pgd()pgd_alloc()/* * need to get a 16k page for level 1 */pgd_t*pgd_alloc(structmm_struct*mm){pgd_t*new_pgd,*init_pgd;pud_t*new_pud,*init_pud;pmd_t*new_pmd,*init_pmd;pte_t*new_pte,*init_pte;/* 分配页目录表(第一级页表)空间(表项为未配置状态) */new_pgd=__pgd_alloc();if(!new_pgd)gotono_pgd;/* 页目录表(第一级页表)用户空间部分的所有表项清 0 */memset(new_pgd,0,USER_PTRS_PER_PGD*sizeof(pgd_t));/* * Copy over the kernel and IO PGD entries *//* 拷贝 内核空间页目录表映射表项 到新分配页目录表的内核空间映射部分 */init_pgd=pgd_offset_k(0);memcpy(new_pgd+USER_PTRS_PER_PGD,init_pgd+USER_PTRS_PER_PGD,(PTRS_PER_PGD-USER_PTRS_PER_PGD)*sizeof(pgd_t));/* 清除新页目录表空间的 cache */clean_dcache_area(new_pgd,PTRS_PER_PGD*sizeof(pgd_t));returnnew_pgd;}

最后看一下进程切换时的页表切换

__schedule()context_switch()switch_mm_irqs_off()switch_mm()check_and_switch_context()voidcheck_and_switch_context(structmm_struct*mm,structtask_struct*tsk){unsignedlongflags;unsignedintcpu=smp_processor_id();u64 asid;.../* TTBR0 = TTBR1 = swapper_pg_dir 物理地址 */cpu_set_reserved_ttbr0();...switch_mm_fastpath:/* 切换到目标进程 @tsk 的页表: TTBR0 = 标进程 @tsk 的页表 */cpu_switch_mm(mm->pgd,mm);}#definecpu_switch_mm(pgd,mm)cpu_do_switch_mm(virt_to_phys(pgd),mm)// cpu_v7_switch_mm

2.2 三级分页

在启用了LPAE(Large Physical Address Extension)功能的情形下,内核最多使用三级分页进行寻址。

照样先上图,Linux 下三级分页寻址过程如下:

Linux 下三级分页寻址过程同时使用TTBR0TTBR1进行page table walkTTBR1指向内核空间 1GB 页表物理基址,且其值始终不会变化;TTBR0用来存储每进程第一级页表物理基址

来简单看一下上图形成的过程。先看TTBR0,TTBR1初始化过程和二级分页基本一致,只不过TTBCR,TTBR1设置是通过proc-v7-3level.S:v7_ttb_setup设置时,TTBR1并不是指向内核页表swapper_pg_dir的物理首地址,而是指向了第二级最后一个 PMD 页表的物理首地址,为啥这样?来看看。三级分页使用Long-descriptor格式,我们讨论的场景是1G:3G划分,所以swapper_pg_dir包含的最后一个 PMD 页表刚好映射内核的1G空间。那为什么不让TTBR1指向swapper_pg_dir的物理首地址呢?这和硬件的实现有关,看一下相关原文:

简单来说,在启用了LPAE(Large Physical Address Extension)功能的情形下,寻址内核 [0xC0000000, 0xFFFFFFFF] 空间时,从第二级 PMD 页表开始 page table walk 的过程,这就是TTBR1指向最后一个第二级 PMD 页表的原因。寻址时VA的 PGD Index 部分可以不用关心了,因为确定寻址的内核空间。

Linux 下三级分页进程第一级页表的创建页表切换过程和二级分页基本相同,这里就不再赘述了。

3. 参考资料

[1] DDI0406C_d_armv7ar_arm.pdf
[2] TLB原理

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 15:35:45

LobeChat直播房间名称创意

LobeChat:打造智能直播房间命名助手的技术实践 在直播行业竞争日益激烈的今天,一个吸睛的直播间名称往往能决定一场直播的初始流量。然而,许多主播仍在为“今晚该起什么标题”而发愁——是走爆款路线博点击?还是保持调性吸引忠实粉…

作者头像 李华
网站建设 2026/4/10 7:51:14

Mermaid Live Editor 完整指南:从零开始制作专业流程图

Mermaid Live Editor 完整指南:从零开始制作专业流程图 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edito…

作者头像 李华
网站建设 2026/4/8 13:14:54

22、培养高性能敏捷团队:策略与实践

培养高性能敏捷团队:策略与实践 1. 引言 在当今时代,应对市场波动、技术趋势和消费者习惯等变化至关重要。传统的层级管理系统和项目形式在快速变化的环境中往往难以适应,而敏捷团队的能力则成为了竞争的关键差异化因素。 敏捷方法起源于软件开发行业,因其灵活性、协作性…

作者头像 李华
网站建设 2026/4/11 14:11:46

OBS-VST插件终极指南:如何在直播中添加专业级音频效果

OBS-VST插件终极指南:如何在直播中添加专业级音频效果 【免费下载链接】obs-vst Use VST plugins in OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-vst 在当今的直播和内容创作领域,优质的音频体验已经成为留住观众的关键因素。OBS-VST作…

作者头像 李华
网站建设 2026/4/12 18:45:13

20、量子算法中的相位反馈与经典应用

量子算法中的相位反馈与经典应用 1. 相位反馈(Phase Kickback) 相位反馈是指通过控制操作,将一个量子门赋予某个量子比特的特征值“反馈”到另一个量子比特上。要实现这一现象,量子比特必须处于叠加态。 在双量子比特状态下,当控制量子比特不处于叠加态 |0> 或 |1&g…

作者头像 李华
网站建设 2026/3/27 1:15:12

23、量子计算在化学与蛋白质折叠中的应用探索

量子计算在化学与蛋白质折叠中的应用探索 1. 海森堡自旋 1/2 哈密顿量 1.1 海森堡模型介绍 海森堡自旋 1/2 模型可用于研究磁系统的临界点和相变。其哈密顿量表达式如下: [H = J\sum_{i,j} (X_i X_j + Y_i Y_j + Z_i Z_j) + h\sum_{i} (X_i + Y_i + Z_i)] 其中,(X_i)、(…

作者头像 李华