Skip to content

定义Definition

访存对齐与跨界访问

Memory access alignment · Misaligned access

区分自然对齐、跨缓存块、执行环境异常与原子性,计算一次访问覆盖的块数。

形式陈述 ​

取非负整数字节地址 a、正整数宽度 n≥1。访问从 a 开始的 n 字节,若 amodn=0,即满足整除条件 n∣a,称它对访问宽度 n 自然对齐。若内存以正整数 B≥1 字节为块,且访问不环绕地址空间,它覆盖的块数为

NB(a,n)=⌊a+n−1B⌋−⌊aB⌋+1.

自然对齐只比较地址和访问宽度;跨块判断还需要块大小。两者均不决定字节序。宽度、对齐要求、越界访问和异常的处理应由 ISA 与执行环境共同明确。

本单元正常执行模型只允许有效的四字节对齐 lw/sw。这是教学限制。固定版 RV32I 2.1 对未对齐数据访问允许 EEI(execution environment interface)作选择,不能把此限制冒充“RISC-V 一律拒绝未对齐访问”。

直觉

可以把内存想成编号格子,但硬件一次搬运的是一组格子。从组内靠后位置开始取数,可能需要访问下一组再拼接。即使拼出的字节完全正确,额外访问、异常检查和并发观察的方式仍可能变化。

对齐是地址的整除条件,并不是“地址看起来规整”。十六进制末位为 4 的地址适合四字节对齐,却不满足八字节对齐。

例子与边界

未对齐不一定跨缓存块 ​

取 B=8。四字节访问 (a,n)=(2,4) 不自然对齐,但只覆盖地址 2,3,4,5,所以 NB=1。访问 (6,4) 同样未对齐,却覆盖块 [0,7] 和 [8,15],所以 NB=2。不能仅用“未对齐”估计传输次数。

四字节访问 (4,4) 自然对齐且只覆盖一个块。在 n∣B 且块边界也按 B 对齐时,宽度为 n 的自然对齐访问不会跨块;若这些假设缺失,结论不再由定义成立。

能完成不等于原子 ​

设一个自定实现把跨边界的四字节写拆为两个两字节写。初值四字节都为零,目标四字节都为 FF。第一半写入后,另一个观察者可能读到 FF FF 00 00。这是一个说明撕裂的实现反例,并不是对所有未对齐访问都如此执行的断言。

原子操作要求对外呈现不可分的效果,不能从“汇编只有一条指令”推出。RV32I 的自然对齐 load/store 有相应原子性保证;未对齐访问是否原子,必须继续看适用规范和扩展。原子的 load/store 也不等于把一串读—改—写合成原子操作。

对齐故障与地址故障不同 ​

地址 0x100 可自然对齐,却位于不允许访问的区域;它仍可能产生访问故障。地址 0x102 可指向有效字节,但四字节访问未对齐。若访问跨越两种权限区域,必须检查整个访问范围,而不能只验证起始地址。

推论与应用

对齐信息帮助分析缓存块映射、数据布局和指令取址,但它不提供实际延迟。报告跨块成本时要说明是否串行、两块是否命中以及是否允许并行请求。

编写解析器时,逐字节取值并按格式组装可以避免偷偷依赖本机对齐规则。编译器是否把这样的代码合成宽 load,仍需保持目标语言和目标平台的行为约束。

参考资料
  • RISC-V International,RV32I 2.1,Load and Store Instructions,固定文档版 v20260120,§1.1.6;区分自然对齐保证与未对齐访问的 EEI 选择。
  • David A. Patterson and John L. Hennessy, Computer Organization and Design RISC-V Edition, 2nd ed., 2021,Chs. 2, 5。本文块数公式和两段写入反例由明确的教学假设推导。
关系图谱4 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组