可以将ARM MMU设置为允许代码执行,但不允许读取

可以将ARM MMU设置为允许代码执行,但不允许读取,arm,mmu,Arm,Mmu,我想知道是否可以为ARM7(特别是Cortex A8)MMU设置页面表条目的权限,以便允许从页面执行代码,但不允许读取 如果权限是正交的,您可能会认为,如果未设置XN(从不执行),则无论是否允许读取,都将允许执行 当然,一些ARM代码在执行时会从自身读取(例如,获取存储在函数末尾之外的文本),该代码不太可能工作 如果您试图执行的代码没有从自身进行任何读取(更具体地说,从禁用读取的页面),那么代码会按预期执行,还是会出现数据中止(或其他)异常?答案似乎是否定的 来自ARM®体系结构参考手册ARMv

我想知道是否可以为ARM7(特别是Cortex A8)MMU设置页面表条目的权限,以便允许从页面执行代码,但不允许读取

如果权限是正交的,您可能会认为,如果未设置XN(从不执行),则无论是否允许读取,都将允许执行

当然,一些ARM代码在执行时会从自身读取(例如,获取存储在函数末尾之外的文本),该代码不太可能工作


如果您试图执行的代码没有从自身进行任何读取(更具体地说,从禁用读取的页面),那么代码会按预期执行,还是会出现数据中止(或其他)异常?

答案似乎是否定的

来自ARM®体系结构参考手册ARMv7-A和ARMv7-R版本第B3.7.2节

处理器可以 仅当当前状态的访问权限允许读取访问且XN位设置为0时,才从内存区域执行指令


我不太明白。处理器必须读取代码段才能获取要执行的指令。如果系统使用hardvard架构(代码和数据的独立路径),我相信ARM会这样做,那么,在处理器执行时访问内存肯定有可能使用与访问内存进行数据访问不同的权限。例如,升级、更新PC可能具有与LDR不同的语义。是的,但在PC递增后,仍需要提取下一条指令(即,需要读取PC指向的内存地址)。同意。我只是想知道,处理器(它知道它为什么要进行一次读取而不是另一次读取)是否可以通过MMU允许读取获取指令,但不允许任何其他数据访问该页面。在某种程度上,它类似于XN的实现方式。与任何其他读取一样,该指令被提取,但随后执行。MMU必须知道其目的是执行指令,还是在设置XN时永远不会生成异常。