#Linux内存管理# 在ARM32系统中,页表是如何映射的?在ARM64系统中,页表又是如何映射的?

一、ARM32系统页表映射

1. 层级结构与地址划分

默认实现:采用两层映射(PGD→PTE),合并Linux标准三级模型中的PMD层。

虚拟地址解析(以4KB页为例):

Bits31:20:一级页表(PGD)索引,定位页目录项(PDE)。

Bits19:12:二级页表(PTE)索引,定位页表项。

Bits11:0:页内偏移量。

特殊模式:

段映射(1MB段):单层映射,虚拟地址高12位直接定位段表项,生成物理段基地址。

大页映射(64KB页):减少页表层级,提升转换效率。

2. 关键硬件机制

TTBR寄存器:存储一级页表(PGD)的物理基地址。

MMU工作流程:

a.从TTBR获取PGD基地址。

b.根据虚拟地址高12位定位PDE。

c.若PDE指向PTE,则继续解析PTE;若直接映射段,则生成物理地址。

页表存储:

PGD:固定16KB大小(4096项×4B),需16KB对齐(如0xc0004000)。

PTE:动态分配,每项4B,描述4KB物理页基地址和权限。

3. 内核实现特点

双套页表:Linux维护独立于硬件的页表项,与ARM32硬件页表紧邻存储。

低端内存优化:前896MB物理内存采用线性映射(__va(phys) = phys + PAGE_OFFSET)。

二、ARM64系统页表映射

1. 层级结构与地址划分

默认实现:采用四级映射(PGD→PUD→PMD→PTE),支持48位虚拟地址(可扩展至52位)。

虚拟地址解析(4KB页为例):

Bits47:39:PGD索引。

Bits38:30:PUD索引。

Bits29:21:PMD索引。

Bits20:12:PTE索引。

Bits11:0:页内偏移量。

大页支持:

2MB大页:合并PMD→PTE,直接通过PMD项映射。

1GB大页:合并PUD→PMD→PTE,直接通过PUD项映射。

2. 关键硬件机制

TTBR0/TTBR1:

TTBR0:用户空间页表基地址(进程独立)。

TTBR1:内核空间页表基地址(全局共享)。

MMU工作流程:

根据当前模式(用户/内核)选择TTBR0或TTBR1。

逐级解析PGD→PUD→PMD→PTE,生成物理地址。

页表动态分配:所有层级页表(包括PGD)均由伙伴系统动态分配,无固定物理地址。

3. 内核实现特点

灵活配置:支持4KB/16KB/64KB页大小(通过CONFIG_ARM64_PAGESIZE配置)。

线性映射区:内核虚拟地址ffff000000000000~ffff7fffffffffff映射所有物理内存,类似ARM32的low memory。

TLB优化:通过连续大页减少TLB未命中率。

三、ARM32与ARM64对比总结

特性 ARM32 ARM64

映射层级 2层(PGD→PTE),支持段映射 4层(PGD→PUD→PMD→PTE),支持动态合并层级

页表存储 PGD固定地址,PTE动态分配 全部页表动态分配

地址空间 32位虚拟地址(4GB) 48/52位虚拟地址(256TB/4PB)

大页支持 1MB段或64KB页 2MB/1GB大页

内核映射优化 低端内存线性映射(896MB) 线性映射区覆盖全部物理内存

寄存器机制 单TTBR寄存器(内核与用户共用) 双TTBR寄存器(TTBR0用户/TTBR1内核)

四、典型场景案例

ARM32设备寄存器映射

static struct map_desc io_desc __initdata = {

.virtual = 0xF0000000, // 虚拟地址

.pfn = __phys_to_pfn(0x10000000), // 物理地址页帧号

.length = SZ_1M, // 映射长度1MB

.type = MT_DEVICE // 设备内存属性

};

iotable_init(&io_desc, 1); // 建立页表映射

ARM64大页内存分配

挂载2MB大页文件系统

mount -t hugetlbfs -o pagesize=2M none /mnt/huge

应用程序通过mmap申请大页

addr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);

五、调试与监控工具

查看页表物理地址:

ARM32查看PGD基址

arm-none-eabi-readelf -a vmlinux | grep swapper_pg_dir

ARM64查看进程PGD

cat /proc/$(pidof process)/arch_status | grep TTBR0

监控页表内存占用:

grep PageTables /proc/meminfo # 显示总页表物理内存占用

通过上述机制,ARM32和ARM64在兼容性与性能之间取得平衡,满足从嵌入式设备到数据中心服务器的多样化需求。

相关推荐
艾莉丝努力练剑15 小时前
【Linux网络】Linux 网络编程:传输层TCP(二)
linux·运维·服务器·网络·tcp/ip·计算机网络
都在酒里15 小时前
Linux字符设备驱动开发(九):内核定时器——实现LED周期性闪烁与轮询驱动原理
linux·运维·驱动开发·交互
都在酒里16 小时前
Linux字符设备驱动开发(十):综合实例——I2C传感器 + LED智能控制与进阶指南
linux·运维·服务器·驱动开发·交互
2301_809051141 天前
Linux 网络编程 学习笔记
linux·网络·学习
坤昱1 天前
cfs调度类深入解刨——最新内核细节分析2
linux·服务器·cfs·cfs调度·eevdf调度·eevdf·kernel 7.1
艾莉丝努力练剑1 天前
【Linux:文件】Ext系列文件系统进阶
linux·运维·服务器·c++·文件系统·文件io·ext
海市公约1 天前
Linux核心基础命令与权限管理实战指南
linux·运维·服务器·vim·权限管理·系统监控·命令行
eggcode1 天前
【Qt学习】Linux(ARM架构)在线安装Qt6.x
linux·qt·学习·arm
wkd_0071 天前
Ubuntu 22.04 Samba 连接故障排查记:从“用户名或密码错误”到 NTLM 版本不兼容
linux·运维·ubuntu
mixboot1 天前
Linux 进程工作目录查看利器:pwdx 命令详解
linux·运维·服务器