通常在Linux/ARM上,映射到0xffff0000的特殊页面用于实现“读取TLS指针”操作,原子比较和交换以及内存屏障。该系统称为“kuser帮助器”(CONFIG_KUSER_HELPERS),它是解决早期 ARM 模型中缺少对原子比较和交换的支持所必需的。但是,最新的内核版本提供了一个选项来禁用此功能,其原则是存在安全风险(由于这些功能不受ASLR的约束,因此基于返回固定的可执行地址来促进攻击);如果构建了所有应用程序以直接使用更新的ARM型号上可用的同步指令,则可以使用此选项。

我的问题是我希望能够使用相同的二进制文件同时支持旧的ARM模型(缺少同步指令)和新的强化内核(缺少kuser帮助器),因此我正在寻找一种可靠的方法,从用户空间到检测kuser帮助程序页面的可用性(如果可用,并使用它,并假设不是,则必须使用较新的说明)。可靠排除了/proc之类可能并不总是可用的东西。除了尝试使用kuser帮助程序页面并捕获SIGSEGV之外,是否有任何方法可以探测它的存在?

最佳答案

vectors页面是在内核初始化期间在arch/arm/kernel/traps.c:early_trap_init()中设置的,并且即使没有助手也将仍然存在,因此您不应该首先获得SEGV。出于同样的原因,mmap技巧不起作用(我没有检查过这些假设中的任何一个)。

但是:vectors页面由early_alloc_aligned()初始化为零,因此您很幸运,因为不会填充0xffff0ffc处的kuser_helpers数量,因此为零。

tl; dr:从0xffff0ffc读取kuser助手的数量。如果为零=>不支持它们

09-08 11:42