我正在使用ARM cortex A5处理器和Linux内核版本在3.13.9左右的Linux嵌入式系统上工作。如何验证是否已启用XN位支持?

另外,我知道ARMv7架构支持它,但是内核要使用它又需要什么呢?

据我所知,/proc/cpuinfo没有ARM xn支持的功能标志(尽管Intel确实有nx的标志)。

另外,似乎新的ARM具有UXN和PXN。这与旧版XN有何关系?

很高兴看到也许看到带有标记位的页表,或者显示NX位= 1的寄存器。此外,是否存在一种易于运行的方法,例如ret2usr攻击来验证保护?非常感谢其他任何验证方法。

最佳答案



根据ARM手册5.5.3. Execute never bits,XN在c1 Control Register中。 Userland(异常级别0)无法访问我知道的配置中的那些字段。

您有两个或三个选择(或者可能是一个)。首先,如果以特权进程(异常级别1或更高)运行,则只需读取c1寄存器。

其次,查看是否可以使用HWCAP来查询功能。这是Torvald的 asm/hwcaps.h ,但是我没有看到HWCAP_XN或类似的代码。 HWCAP_IWMMXT可能是它,但是我找不到定义代表的内容。
HWCAP是最简单的路径,因为您只需要执行以下操作(但您似乎无法使用它):

if ((getauxval(AT_HWCAP) & HWCAP_XN) != 0)
    return true;

由于第二选择不可用,因此可以执行功能探针。之所以称它们为SIGILL探针,是因为您经常在探寻ISA支持,例如使用NEON加载的NEON。如果捕获到SIGILL,则说明处理器不支持NEON。

对于您的情况,您应该执行@ o11c在注释中建议的内容。您应该分配一个页面,设置PROT_EXEC,然后查看是否可以写入该页面。如果您无法对其进行写入,则write将失败并显示errno=EPERM,否则您将捕获异常。如果write失败,则将NX功能标记为可用。

我没有用于XN的功能探针(我从不需要它),但是我可以向您展示probing for ARMv7 supportSIGILL探针的外观。

另外,请注意Apple机器上的探针。苹果在使用longjmp之后有一个会影响寄存器或进程状态的错误,它将把事情糟透了。切勿在Apple平台上进行探测。只需为该功能返回false。
extern "C" {
    typedef void (*SigHandler)(int);

    static jmp_buf s_jmpSIGILL;
    static void SigIllHandler(int)
    {
        longjmp(s_jmpSIGILL, 1);
    }
}

bool CPU_ProbeARMv7()
{
    // longjmp and clobber warnings. Volatile is required.
    // http://stackoverflow.com/q/7721854
    volatile bool result = true;

    volatile SigHandler oldHandler = signal(SIGILL, SigIllHandler);
    if (oldHandler == SIG_ERR)
        return false;

    volatile sigset_t oldMask;
    if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask))
        return false;

    if (setjmp(s_jmpSIGILL))
        result = false;
    else
    {
        // ARMv7 added movt and movw
        int a;
        asm volatile("movw %0,%1 \n"
                     "movt %0,%1 \n"
                     : "=r"(a) : "i"(0x1234));
        result = (a == 0x12341234);
    }

    sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
    signal(SIGILL, oldHandler);
    return result;
}

关于linux - 我怎么知道我的系统上是否启用了ARM的XN(从不执行)位支持?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56083538/

10-10 15:57