当然虚拟地址空间划分不只是如此。因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址,实际支持情况如下。
(1)-虚拟地址位宽
虚拟地址的最大宽度是48位 内核虚拟地址在64位地址空间的顶部,高16位是全1,范围是[0xFFFF 0000 0000 0000,0xFFFF FFFF FFFF FFFF];
用户虚拟地址在64位地址空间的底部,高16位是全0,范围是[0x00000000 0000 0000,0x0000 FFFF FFFF FFFF];
高16位是全1或全0的地址称为规范的地址,两者之间是不规范的地址,不允许使用。
如果处理器实现了ARMv8.2标准的大虚拟地址(Large Virtual Address,LVA)支持,并且页长度是64KB,那么虚拟地址的最大宽度是52位。这个也就是大页表,可以提升内存与访问速度。
可以为虚拟地址配置比最大宽度小的宽度,并且可以为内核虚拟地址和用户虚拟地址配置不同的宽度。
转换控制寄存器(Translation Control Register)TCR_EL1的字段T0SZ定义了必须是全0的最高位的数量,字段T1SZ定义了必须是全1的最高位的数量,用户虚拟地址的宽度是(64-TCR_EL1.T0SZ),内核虚拟地址的宽度是(64-TCR_EL1.T1SZ)。(全是0是代表的用户,全是1代表的是内核。)
(2)编译ARM64架构的Linux内核时,可以选择虚拟地址宽度
• (1)如果选择页长度4KB,默认的虚拟地址宽度是39位。
• (2)如果选择页长度16KB,默认的虚拟地址宽度是47位。
• (3)如果选择页长度64KB,默认的虚拟地址宽度是42位。
• (4)可以选择48位虚拟地址。
在ARM64架构的Linux内核中,内核虚拟地址和用户虚拟地址的宽度相同。
• 所有进程共享内核虚拟地址空间,
• 每个进程有独立的用户虚拟地址空间,
• 同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。
-
处理器
+关注
关注
68文章
20148浏览量
247133 -
ARM
+关注
关注
135文章
9499浏览量
388708 -
内存
+关注
关注
9文章
3173浏览量
76115 -
MMU
+关注
关注
0文章
92浏览量
19109
发布评论请先 登录
请问ARM的虚拟地址映射有“扩大”内存范围的作用吗
请问ARM虚拟地址 物理地址 加载地址 运行地址的联系是什么?
【HarmonyOS】虚拟地址<->物理地址是如何映射的
鸿蒙内核源码分析(内存映射篇):虚拟地址与物理地址之间是如何映射的
物理地址到虚拟地址的转换步骤
探讨一下ARM中的MMU虚拟地址
linux kernel实现物理地址到虚拟地址空间的切换方法
内核逻辑地址和内核虚拟地址到底有什么区别
虚拟地址和逻辑地址的区别是什么?
虚拟地址物理地址等众多地址及MMU相关知识

MMU虚拟地址空间布局
评论