ARM调试接口——术语(未完成)

引言

在本文中,主要介绍(翻译)ARM调试接口中的相关术语、软硬件行为准则等.

水平有限,难免存在出错的地方。具体还请查阅手册.

请注意: 本文中出现的术语适用于ARM调试接口架构规范(ARM Debug interface architecture specification)的相关内容,我不保证适用于其他ARM架构或是其他规范所描述的内容。

CONSTRAINED UNPREDICTABLE

受限不可预测的。如果某条指令可能导致不可预测的(UNPREDICTABLE)行为,ARM架构可能会在一定的范围内限制允许的行为表现。这个范围称为受限不可预测行为的范围。与本体系架构兼容的所有实现必须遵循受限的不可预测行为。但是,软件不得依赖任何受限不可预测行为.


DATA LINK DEFINED

表示基础架构未定义该行为,但是架构中独立的数据链路层(Data Link layer)必须定义并归档这一行为.


IMP

IMPLEMENTATION DEFINED.


IMPLEMENTATION DEFINED

表示基础架构未定义该行为,但是独立的实现必须定义并归档这一行为.


RAO(Read-As-One)

硬件实现上必须使得字段始终读出全为1的值,软件可以得到读取值全为1的保证。这一描述适用于单个位读出为0b1,也适用于字段读出全为1的情况.


RES0

一个保留的位或字段,具有与Should-Be-Zero-or-Preserved (SBZP) 相同的行为。用于寄存器描述中的字段,以及架构定义的保存于内存中的数据结构字段,例如翻译表(translation table)描述符.

注意: 在指令编码的描述中不使用RES0.

在本架构中,一些寄存器的位或位域可能具有以下情况:

  • RES0是否处于某种确定的架构环境中.
  • 在不同的架构环境中是否具有不同的已定义行为.

这意味着寄存器字段的RES0的定义取决于不同的情况:

1. 如果一个位在所有情况下都是RES0

将由实现定义(IMPLEMENTATION DEFINED)是否要采取这些行为:

  • 行为1 该位硬连线到0b0,在这种情况下:

    • 读取该位总是得到0b0的结果.
    • 对该位的写入操作将被忽略.

这时,该位可以被描述为RES0WI,以区别于行为2中所述的位.

  • 行为2 该位可写,在这种情况下:

    • 对寄存器的间接写入将该位设置为0b0.
    • 读取该位时,返回成功写入该位的最后一个值.(注意: 写入值的操作可以通过间接写入寄存器来完成)如果该位自复位后没有成功写入,那么在进行读取操作时,如果有复位值则返回复位值,否则返回一个未知(UNKNOWN)值.
    • 对该位的直接写入必须更新与该位相关的存储位置.
    • 该位的值的影响范围仅在于决定从该位读回的值,除此之外,必须对内核的运行没有任何影响.

一个RES0位或字段遵循行为1还是行为2,是在逐字段的基础上实现定义的.

2. 如果一个位只在某些情况下为RES0

当一个位被描述为RES0时:

  • 间接写入寄存器会将位设置为0b0.
  • 对该位的读取操作必须返回最后一次成功写入该位的值,不管该位被写入时寄存器的用途如何.(注意: 写入值的操作可以通过间接写入寄存器来完成)如果该位自复位后没有成功写入,那么在进行读取操作时,如果有复位值则返回复位值,否则返回一个未知(UNKNOWN)值.
  • 对该位的直接写入必须更新与该位相关的存储位置.
  • 该位的值的影响范围仅在于决定从该位读回的值,除此之外,必须对内核的运行没有任何影响.

对于上面所说的任意情况,当位被描述为RES0时,软件需要遵循以下规则:

  • 读操作,一定不要依赖将位读出为0b0的结果.
  • 写操作,必须以SBZP策略对该位进行写操作.

RES0描述适用于只读或只写的位或位域:

  • 对于读操作,该位将读出为0b0,但是软件需将其视为未知(UNKNOWN)值对待.
  • 对于写操作,软件必须以SBZ策略对待.

Should-Be-Zero (SBZ)

硬件必须忽略对此字段的写操作.

软件在进行写操作时,需始终将整个字段写0。如果写的值不全为0,那么将导致不可预测的(UNPREDICTABLE)结果.

如果本描述适用于一个单独的位,其应为0b0,如果适用于一个字段,则整个字段全为0.


Should-Be-Zero-or-Preserved (SBZP)

ARMv7大物理地址扩展(Large Physical Address Extension, LPAE)修改了有关SBZP的定义,以适用于某些(而不是全部)情况下被描述为SBZP的寄存器字段。从ARMv8开始这样的寄存器字段为描述为res0,见RES0。此处给出的SBZP定义只适用于那些在所有情况下均为SBZP的寄存器.

硬件必须忽略对此字段的写操作.

如果核心实现了此字段,在最后一次复位和初始化之后软件若已经读取了此字段的值,在进行写操作时,软件必须向该字段写入其先前读取到的值,以此保留该字段的值。否则,字段必须全写入0.

如果软件向字段写入的值既不是其先前读取的值,也不是全0值,那么造成的结果将是不可预期的(UNPREDICTABLE).

本描述适用于一个位,应向其写入原先的保留值或0b0,也适用于一个位域,应向其写入原先的保留值或全0值.

另请参阅Should-Be-One-or-Preserved (SBOP), Should-Be-Zero (SBZ).


UNKNOWN

UNKNOWN值不包含有效数据,其值可能随时间、指令、实现的变化而变化。一个UNKNOWN值不能返回在当前或更低权限级别上执行的某些指令结果信息。这里的结果不是不可预测的(UNPREDICTABLE),也不是受限不可预测的(CONSTRAINED UNPREDICTABLE),并且不返回UNKNOWN值.

一个UNKNOWN值不可被归档或是进一步被视作具有确定值或确定效应.

An UNKNOWN value must not return information that cannot be accessed at the current or a lower level of privilege using instructions that are not UNPREDICTABLE or CONSTRAINED UNPREDICTABLE and do not return UNKNOWN values.


UNPREDICTABLE

对于ARM处理器,“不可预测的(UNPREDICTABLE)”意味着该行为不能被依赖。不可预测的行为不得使用非UNPREDICTABLE的指令执行任何不能在当前或更低级别权限下执行的功能。不可预测的行为不可被归档,或是被进一步视作具有确定效应的行为。一个不可预测的指令可以视作UNDEFINED来实现.

在支持虚拟化的实现中,在较低权限等级下对不可预测指令进行非安全(Non-secure)执行的操作可以被虚拟机管理器(hypervisor)捕获,但前提是在低权限等级下权限运行时,至少有一条非UNPREDICTABLE指令可被虚拟机管理器捕获.

对于ARM跟踪微单元(trace macrocell),“不可预测的(UNPREDICTABLE)”意味着微单元的行为不能被依赖。这样的情况还没有被验证。当对一个事件资源进行编程时,只有该事件资源的输出是不可预测的。不可预测的行为会影响整个系统的行为,这是因为微单元会导致系统进入Debug状态,而外部输出可以用于其他目的.


Write Ignore(WI)

硬件必须忽略对此字段的写操作。软件可以依赖写操作被忽略这一行为。这一描述适用于单个位,也适用于字段.


W1C

硬件需要为该位实现以下操作:

  • 向该位写0b1,将该位清除为0b0.
  • 向该位写0b0,对该位无影响.