“从 $0x101$ 开始读取两个字节,小端得 ,大端得 。这说明端序定义也适用于字段内部的子读取,不必假定每次都从四字节边界开始。该读取在特定机器上能否执行,另由访存对齐规则决定。”
形式陈述
取非负整数字节地址
自然对齐只比较地址和访问宽度;跨块判断还需要块大小。两者均不决定字节序。宽度、对齐要求、越界访问和异常的处理应由 ISA 与执行环境共同明确。
本单元正常执行模型只允许有效的四字节对齐 lw/sw。这是教学限制。固定版 RV32I 2.1 对未对齐数据访问允许 EEI(execution environment interface)作选择,不能把此限制冒充“RISC-V 一律拒绝未对齐访问”。
直觉
可以把内存想成编号格子,但硬件一次搬运的是一组格子。从组内靠后位置开始取数,可能需要访问下一组再拼接。即使拼出的字节完全正确,额外访问、异常检查和并发观察的方式仍可能变化。
对齐是地址的整除条件,并不是“地址看起来规整”。十六进制末位为 4 的地址适合四字节对齐,却不满足八字节对齐。
例子与边界
未对齐不一定跨缓存块
取
四字节访问
能完成不等于原子
设一个自定实现把跨边界的四字节写拆为两个两字节写。初值四字节都为零,目标四字节都为 FF。第一半写入后,另一个观察者可能读到 FF FF 00 00。这是一个说明撕裂的实现反例,并不是对所有未对齐访问都如此执行的断言。
原子操作要求对外呈现不可分的效果,不能从“汇编只有一条指令”推出。RV32I 的自然对齐 load/store 有相应原子性保证;未对齐访问是否原子,必须继续看适用规范和扩展。原子的 load/store 也不等于把一串读—改—写合成原子操作。
对齐故障与地址故障不同
地址
推论与应用
对齐信息帮助分析缓存块映射、数据布局和指令取址,但它不提供实际延迟。报告跨块成本时要说明是否串行、两块是否命中以及是否允许并行请求。
编写解析器时,逐字节取值并按格式组装可以避免偷偷依赖本机对齐规则。编译器是否把这样的代码合成宽 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。本文块数公式和两段写入反例由明确的教学假设推导。