ARM 内存管理翻译笔记

参考文献:

1.《ARM Cortex-A(armV7)编程手册V4.0》

2.《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》

3.《深入理解Linux内核》

注意:尽量阅读原文ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition,作者只做了自己需要了解的部分的翻译。尽量避免断章取义。


1.Virtual Memory System Architecture (VMSA)虚拟内存系统架构

B3.1 About the VMSA 关于VMSA

        在VMSAv7中,内存管理单元(MMU)控制地址转换、访问权限和内存属性的确定和检查,以及处理器进行的内存访问。MMU由系统控制寄存器控制,也可以禁用MMU。

        每个MMU使用一组地址转换和内存映射表中的相关内存属性。对于MMU,转换表定义了以下属性:

  • 访问安全或不安全地址映射
  • 内存访问权限控制:不访问、只读、只写、只读/写
  • 内存区域属性:顶层属性、内存类型、设备类型等
  • 地址转换映射:
    • 如果只有一个转换阶段,那么就是从虚拟地址(VA)到物理地址(PA)
    • 如果由两个转换阶段,那么第一阶段从虚拟地址转到中间物理地址(IPA),第二阶段从IPA转到PA,如下图

        系统控制协处理器(CP15)寄存器控制VMSA,包括定义转换表的位置,以及启用和配mmu。此外,它们还会报告在内存访问过程中发生的任何故障。

 B3.1.1 Address types used in a VMSA description VMSA介绍中用到的地址

        对VMSAv7的描述引用了以下地址类型:

        虚拟地址:  指令中使用的地址,作为数据或指令地址,是虚拟地址(VA)。PC、LR或SP中的地址是VA。VA映射从零运行到VA空间的大小。对于ARMv7,最大VA空间为4GB,最大VA范围为0x00000000-0xFFFFFFFF。

        中间物理地址:在提供两个地址转换阶段的转换中,IPA是第1阶段转换后的地址,也是第2阶段转换的输入地址。在只提供一个地址转换阶段的转换机制中,IPA与PA相同。

        在ARM VMSA实现中,只提供了一个地址转换的阶段:

  •         如果实现不包含虚拟化扩展
  •         安全状态执行时
  •         在Hyp模式下执行。

B3.1.2 Address spaces in a VMSA implementation VMSA中的地址空间

        ARMv7体系结构支持:

  • 最多32位的VA地址空间。实际宽度为具体实现定义
  • 一个高达40位的IPA地址空间。转换表和相关的系统控制寄存器定义了所实现的地址空间的宽度。

        备注:大型物理地址扩展程序定义了两种转换表格式。长描述符格式允许以4kb的粒度访问完整的40位IPA或PA地址空间。短描述符格式:

  • 允许访问32位PA地址空间,但最小访问单位为4KB。
  • 用于访问40位的PA地址空间,但最小访问单位为16MB。

B3.1.3 About address translation 地址转换

        地址转换是将一种地址类型映射到另一种地址类型的过程,例如,将VAs映射到IPAs,或将VAs映射到PAs。转换表定义了从一种地址类型到另一种地址类型的映射。

        转换表基址寄存器表示转换表的开始。

        一个完整的转换表查找过程被称为转换表遍历。它是由硬件自动执行的,并且会耗费一些时间。为了完成VA到PA的映射,由于最小访问单位的原因,单个输入地址到输出地址的转换可能需要对转换表进行多次访问,每次访问都提供更小的访问单元。每次访问都被描述为一个地址查找级别。查找的最后一个级别定义了:

  • 所需的输出地址
  • 被寻址的存储器的属性和访问权限

        转换备用缓冲区(TLBs)通过缓存转换表遍历的结果,降低了内存访问的平均时间。TLBs表现为转换信息表的缓存,为了管理TLBs的内容,VMSA为TLBs提供了维护操作。

B3.3 Translation tables

        VMSAv7定义了两种可替代的转换表格式:

        短描述符格式:不包含大型物理地址扩展的实现中唯一支持的格式。它在转换表中使用了32位的描述符条目,并提供了:

  • 最多两级地址查找;
  • 32位输入地址;
  • 输出地址最高可达40位;
  • 通过使用supersections实现32位以上地址的支持,最小内存单位为16MB
  • 支持无访问域、客户端域和管理器域
  • 32位的表条目(entry)

        长描述符格式:大型物理地址扩展增加了对这种格式的支持。它在转化表中使用了64位的描述符条目,并提供了:

  • 最多三级地址查找
  • 第二级转换时,输入地址高达40位
  • 输出地址高达40位
  • 整个PA范围使用4kb的最小内存访问单元
  • 不支持域,所有存储区都被视为在客户域中
  • 64位表条目
  • 固定4kB的表大小,除非输入地址被截断

B3.3.2 Information returned by a translation table lookup 转换表遍历返回结果

        在VMSA实现中,当启用了关联的MMU时,内存访问需要一个或多个转换表查找。如果TLB中没有转换所需的转换表描述符,则执行转换表遍历以获取描述符。无论是从TLB还是作为转换表遍历的结果,都返回:

  • 与查找的输入地址对应的输出地址
  • 与该输出地址对应的一组属性。

B3.5 Short-descriptor translation table format

短描述符转换表格式

        短描述符转换表格式支持以内存段(memory sections)或内存页(memory pages)为基础的内存映射(笔记:section和page是内存单元的描述):

  • Spersections: 16MB的内存块(memory block)
  • Sections:         1MB的内存块
  • Large pages:   64KB的内存块
  • Small pages:     4KB的内存块
        Supersections, Sections 和Large pages 映射内存的大区域,他们只使用一个TLB条目。
        当使用段描述符转换表格式时,内存中保留两级转换表:
        第一级转换表:包含基地址,Section和Supersection的转换属性,指向第二级表的Large page或者Small page的指针;
        第二级转换表:包含基地址,Small page和Large page的转换属性,二级表需要1KB的内存,二级表也叫做页表(page table)
        在转换表中,描述符可以是:
  • 一个无效的或错误的记录
  • 一个页或者段的记录,它定义了内存访问属性
  • 保留的格式

描述符的位[1:0]给出了描述符类型。

图B3-3给出了在使用短描述符转换表格式时的地址转换的一般视图。

图中说明了虚拟地址VA[31-N:20]包含了一级转换表的索引信息,VA[19:12]包含二级表(页表)的索引信息。

 B3.5.1 Short-descriptor translation table format descriptors

        短描述符转换表的一级描述符格式

        第一级表中的每个条目都描述了关联的1MB 的MVA(修改后的虚拟地址)的映射。

        一种32位的描述符格式如下,最后两位bits[1:0]决定描述符类型,这两位为01时,描述符给出了一个二级转换表的地址,该表指定了关联的1MByte 的VA映射。

         第一级描述符中的地址信息为:

         Page table :描述符的位Bits[31:10]是页(Page)地址的bits[31:10]

        Section:描述符的位Bits[31:20]是节(Section)地址的bits[31:20]位

        Supersection:描述符的位 Bits[31:24]是超级块(Supersection)地址的 bits[31:24]
                
        笔记:使用Section作为一级页表中的最小寻址单位时,共12位地址表示,也就是一级描述符将4GB的虚拟地址划分为 4096*1MB。
Short-descriptor translation table second-level descriptor formats
短描述符转换表的二级描述符格式
        二级描述符中的地址信息为:
        Large page:描述符的位 Bits[31:16]是大页(Large page)地址的 bits[31:16]
        Small page:描述符的位 Bits[31:12]是小页(Small page)地址的 bits[31:12]
·        笔记:使用Small Page作为二级页表的最小寻址单位时,共20位地址表示,也就是2^20*4KB = 4GB

B3.5.2 Memory attributes in the Short-descriptor translation table format descriptors

B3.5.2短描述符转换表格式描述符中的内存属性

        本节描述除描述符类型字段和地址字段以外的描述符字段:

          TEX[2:0], C, B    内存区域属性位

         AP[2], AP[1:0]    访问权限位

B3.5.5 Translation table walks, when using the Short-descriptor translation table format

3.5.5翻译表遍历时,使用短描述符转换表格式

Section(1MB)的转换流程

Small page的转换流程

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ARM架构中,可以通过一些方法来查看内存越界。内存越界指的是程序访问了其分配以外的内存区域,可能会导致程序崩溃或产生不可预测的结果。 一种查看内存越界的方法是通过使用调试器,如GDB(GNU调试器)。GDB是一个功能强大的工具,可以用于调试C/C++程序,在ARM平台上也可使用。 首先,需要在编译时开启调试信息,以便能够从调试器中获取更多的信息。在编译时使用"-g"选项,例如:"gcc -g test.c -o test"。 然后,可以使用GDB来运行程序。在命令行中输入"gdb test"(其中“test”是可执行文件的名字),GDB将会启动并显示一个提示符。 接下来,可以使用GDB的一些命令来查看内存越界。例如,使用"break"命令在程序的某个关键位置设置一个断点,让程序在该处停下来。 当程序执行到断点处停下来后,可以使用"print"命令来查看特定变量的值,例如:"print var"(其中“var”是要查看的变量名)。 此外,还可以使用"watch"命令来监视特定变量或内存地址的变化情况,例如:"watch var"(其中“var”是要监视的变量名)。 如果程序在访问越界内存时崩溃了,GDB将会打印一些有用的信息,如访问越界的内存地址,以及相关的堆栈追踪信息。 总之,通过使用GDB调试器,可以方便地查看内存越界问题,并定位到具体的代码位置,从而进行修复。同时,对于遇到的一些特殊情况,还可以使用GDB的其他命令和功能来进一步分析和排除问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vicssic

与你一起成长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值