内存
1.地址空间
RISC-V线程可以单字节寻址2 XLEN 字节内存地址空间。
类型 | 字节数 |
---|---|
半字 | 2字节 |
字 | 4字节 |
双字 | 8字节 |
四字 | 16字节 |
内存地址空间是环形的,也就是地址2XLEN-1地址空间和0地址空间是相邻的。关于内存地址计算时忽略溢出。
可执行环境将硬件资源映射到线程的地址空间(address space),线程地址空间的不同范围可能是:1)空;2)包含主存;3)包含一个或多个I/O设备;
读I/O设备有显著副作用,访问主存没有。因此,虽然可执行环境可以将线程地址空间每一部分都称为I/O设备空间,但通常希望将某些空间设定为主存。
RISC-V平台有多个线程时,任何两个线程的地址空间可能是完全一样,或者完全不同,或者部分相同来共享一些资源。
裸机可执行环境,每个线程地址空间完全一样;
包含地址转换的操作系统,通常每个线程被分配一个虚拟地址空间 ,是自己独有的。
2.隐式和显示内存访问
执行每一条指令需要一次或多次访问内存。具体分为显示和隐式访问。
- 为了执行指令,需要隐式读指令内存(取指)操作,为了获得需要执行的编码指令。许多RISC-V指令除了取指令操作不再进一步访问内存。
- 但是,专用的加载和存储指令会根据指令指定的内存地址执行显式读写内存操作。
可执行环境决定了非空地址空间哪些部分是可以访问的。例如,指令地址空间和数据存储空间可能有重叠,也可能没有。通常,一个指令访问一个不允许访问的地址时会触发异常,空地址空间永远都不可以被访问。
3.内存访问顺序说明
除非有特别说明,不会产生异常和副作用的隐式读操作可能会任意提前执行,甚至可能在机器证明需要读之前发生。例如,一种有效的实现是尝试在最早时机读主存的所有内容,cache缓存尽可能多的指令更后续取指使用,避免取指令再次读主存。
针对同一块内存空间,为了确保某些隐式的读操作被排在写操作之后,软件必须执行专用的fence和cache控制指令,来达到排序目的。(如,第3章的FENCE.I指令)
内存一致性
一个线程的内存访问行为,可能被其他线程或代理以不同顺序感受到,这种感知到内存访问顺序重拍总是受限的,因此要受到内存一致性模型约束。RISC-V默认的内存一致性模型是RISC-V弱内存排序(RISC-V Weak Memory Ordering, RVWMO),在14章和附件中有定义。
可选项,实现也可以采用更强的模型(Total Store Ordering),这部分在23章有描述。可执行环境也添加约束进一步限制感知的内存访问排序。
由于RVWMO是最弱模型,可以被任何RISC-V实现采纳,所以此名编写的软件和所有RISC-V实现的内存一致性规则都可以兼容。和隐式读一样,软件必须执行fence或者cache控制指令来保证特定内存访问顺序,已达到或者超过模型或可执行环境的要求。