c语言 - Linux/ARM "kuser_helper"函数的运行时检测



通常在Linux/ARM上,映射到0xffff0000的一个特殊页面用于实现"读取TLS指针"操作、原子比较和交换以及内存屏障。这个系统被称为"kuser helper"(CONFIG_KUSER_HELPERS),对于解决早期arm模型中缺乏原子比较与交换支持的问题是必要的。然而,最近的内核版本提供了禁用此功能的选项,因为它存在安全风险(容易基于返回固定可执行地址的攻击,因为这些功能不受ASLR的约束);如果所有的应用程序都是为了直接使用更新的ARM模型上可用的同步指令而构建的,则可以使用此选项。

我的问题是,我希望能够支持旧的ARM模型(缺乏同步指令)和新的强化内核(缺乏kuser helper)与相同的二进制文件,所以我正在寻找一个可靠的方法,从用户空间,检测kuser helper页面的可用性(使用它,如果它是可用的,并假设如果它不是,新的指令必须可用)。可靠排除了像/proc这样可能并不总是可用的东西。是否有任何方法可以探测kuser helper页面的存在,而不是尝试使用它并捕获SIGSEGV ?

向量页面在内核初始化期间设置在arch/arm/kernel/traps.c:early_trap_init()中,并且仍然存在,只是没有帮助程序,所以您首先不应该获得SEGV;出于同样的原因,mmap技巧不会起作用(我还没有检查过这两个假设)。

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

tl;dr:从0xffff0ffc读取kuser helper的数量。如果0 =>不支持

最新更新