计算机系统开发与优化实战
上QQ阅读APP看书,第一时间看更新

1.5 内存模式

为了对指令乱序、数据预取等进行更好的控制,ARMv8架构定义了两种类型的内存——普通内存和设备内存。普通内存主要用来存储数据和代码,处理器能够对这些内存做re-order、re-size、repeate、数据预取等操作。设备内存指的是I/O等内存,主要用于外设。对这部分内存的访问一般会产生副作用,因此读写设备内存会有更多的限制。设备内存不允许预读。对于某些内存区域,还可以赋予可执行(executable)、可共享(shareable)、可缓存(cacheable)等属性。

1.5.1 内存对齐

近年来,ARM服务器发展迅速,为了更好地兼容已有的服务器程序,被标记为普通内存的内存数据默认配置成可以非对齐访问。但是作为可选项,普通内存数据也可以配置成当访问非对齐内存数据时触发一个同步数据异常(synchronous data abort)。标记为设备内存的内存数据不支持非对齐访问。指令预取(instruction fetch)也必须是对齐的。

1.5.2 检查内存模式问题的工具

herd7是一个专门用来分析和检查内存模式问题的工具,使用以下代码可以在Ubuntu系统上安装herd7工具。

sudo apt-get install dune
sudo apt-get install opam
git clone ******//github****/herd/herdtools7.git

cd herdtools7/
sudo make all PREFIX=/usr/local
sudo make install PREFIX=/usr/local
diyone7 -arch AArch64 PodWW L Rfe A PodRR Fre
diyone7 -arch X86 PodWW L Rfe A PodRR Fre
herd7 -model ./sc.cat SB.litmus
herd7 a.litmus