gpt4 book ai didi

linux - 我如何知道我的系统是否启用了 ARM 的 XN(永不执行)位支持?

转载 作者:太空狗 更新时间:2023-10-29 12:22:31 25 4
gpt4 key购买 nike

我正在开发一个带有 ARM cortex A5 处理器和大约 3.13.9 左右的 linux 内核版本的 linux 嵌入式系统。如何验证是否启用了 XN 位支持?

此外,我知道 ARMv7 架构支持它,但内核需要什么才能使用它?

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

此外,较新的 ARM 似乎具有 UXN 和 PXN。这与旧版 XN 有什么关系?

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

最佳答案

How can I verify whether XN bit support is enabled?

根据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 的功能探测器(我从来不需要它),但我可以向您展示 SIGILL 探测器在 probing for ARMv7 support 时的样子.

还要小心 Apple 机器上的探测器。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com