单独内存页上的隔离代码和只读数据
在Armv8-A VMSA中,转换表条目包括定义目标内存区域属性的字段,例如其访问权限。翻译表条目可以寻址的最小内存单位是内存页。
因此,如果软件需要在两个内存区域上设置不同的权限,则需要使用不同的内存页来映射它们。
每个BL图像的默认内存布局如下:
注意:异常向量的2KB对齐是体系结构要求。
读写数据从一个新的内存页开始,以便可以使用读写权限映射它们,而下面的代码和只读数据则配置为只读。
但是,只读数据不会在页面边界上对齐。它们与代码相邻。因此,代码段的结尾和只读数据段的开头可能共享一个内存页。这将强制使用相同的内存属性映射两者。由于代码需要是可执行的,这意味着存储在与代码相同的内存页上的只读数据也是可执行的。这可能被用作安全攻击的一部分。
TF提供构建标志SEPARATE_CODE_AND_RODATA,以隔离单独内存页上的代码和只读数据(到这里总算是明白这个标题是什么意思了。)。这反过来允许独立控制代码和只读数据的访问权限。在这种情况下,平台代码可以获得镜像布局的更细粒度视图,并可以适当地将代码区域映射为可执行,将只读数据映射为从不执行。