- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个带有 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/
我想知道 xn-- (domain) -66b.com 在域中的含义。例如,我用 ñ 购买了 diseñolatinoamericano.com。 在 mozilla 中它出现 http://xn--
我正在尝试创建一个解析器扫描器,它将获取一个文件作为输入,该文件内部包含这样的内容:5 + 23 + ..... + 3; 我想要它将结果打印在屏幕上。 我发现有点难以理解 $$ = $1 +...
如果我使用诸如 www.äöü.com 之类的域,有什么方法可以避免它在用户中显示为 www.xn--4ca0bs.com ' 浏览器? 我猜像 www.xn--4ca0bs.com 这样的域名会给普
假设我有以下 DOM 树: text text text text text text text text text
我能做到 fruits=['mango','fig','apple'] for fruit in fruits: print (fruit , end=" ") 输出: mango fig a
我有一些数据,例如: data(iris) 我想重命名列,使 Species 成为 Y 变量,所有 其他变量成为预测变量。 我目前所拥有的并没有给我想要的结果。 iris %>% select(S
我能做到 fruits=['mango','fig','apple'] for fruit in fruits: print (fruit , end=" ") 输出: mango fig a
我有一些数据,例如: data(iris) 我想重命名列,使 Species 成为 Y 变量,所有 其他变量成为预测变量。 我目前所拥有的并没有给我想要的结果。 iris %>% select(S
在 JavaScript 中 (x, x1, x2, …, xn) 总是返回 xn。 在 Python 中,这段代码称为元组,它返回不同的值。 我的问题是这段代码在 JavaScript 中的用途是什
我正在开发一个带有 ARM cortex A5 处理器和大约 3.13.9 左右的 linux 内核版本的 linux 嵌入式系统。如何验证是否启用了 XN 位支持? 此外,我知道 ARMv7 架构支
这个问题和我的previous question密切相关.唯一的区别是,我不想要绘制数据,而是想要适合的原始数据。我尝试按照上一个答案自己解决,但仍然卡住了。 所以我想从线性回归的拟合中检索自变量、拟
这个问题在这里已经有了答案: Last digit of power list (2 个答案) 关闭 4 年前。 我需要从作为列表传递给函数的整数中找到 x1 ^ (x2 ^ (x3 ^ (...
是否可以使用 LINQ 转换包含坐标元组 (x, y) 的平面 double 组,即[x0,y0, ..., xN, yN] 到长度为一半的数组,其中包含包装在 Point 类中的相同坐标,即 [p0
我正在使用curl命令来调用rest api。我想发布数据,我的curl命令如下所示: curl –x POST -u 'username:PW' -k -H "Content-Type:applic
我在访问以下网址时遇到了一个奇怪的问题: http://xn--fanbys-exa.org/episodes.m4a.rss 这是代码: void WebRequestButton_Clic
xi=exprnd(1,M,1), i=1,...,N ,是 M x 1 的列向量尺寸。这意味着j-th xi 的元素是 xi(j)>=0 。 我想获取 Mx1 大小的列向量 X,其中 j-th X
所以下面“模式”中包含的这个正则表达式,只应该匹配我在下面评论中所说的内容(最基本的匹配是 1 个字母后跟一个点,然后是两个字母) var link = "Help" // matches www-d
我正在尝试安装 maria db 并遇到以下问题。 [root@localhost ~]# service mysqld start Redirecting to /bin/systemctl sta
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我的问题:给出一个列表 L = [x1,...,xn] 编写 Prolog 程序 convert(L,X)转换 L到一个整数 x1*10^0 + x2*10^1 + ... + xn*10^(n-1)
我是一名优秀的程序员,十分优秀!