我正在寻找一种可靠的、不显眼的运行时检查进程是否可以在没有 mmu 的情况下在 Linux 上运行。不显眼,我的意思是对进程状态的副作用最小或没有。例如,get EINVAL
fromfork
是一种指示,但如果测试失败,则会创建一个子进程。尝试引起故障并捕获信号是不可能的,因为它涉及更改全局信号配置。任何涉及/proc
或/sys
不可靠的东西,因为它们可能不被挂载/可见(例如,在chroot
或挂载命名空间中)。
mprotect
with的失败ENOSYS
似乎是可靠的,并且可以在没有任何副作用的情况下完成,除了需要映射一个测试页面来尝试它。但我不确定依靠这个是否安全。
有没有更好/推荐的方法来解决这个问题?
在任何人试图挑战这个前提并回答这是在编译时静态已知的之前,不,它不是。假设您为架构的 mmu-ful 和 mmu-less 变体都支持的 ISA 级别构建与位置无关的可执行文件,它可以在任何一个上运行。(我是完成这项工作的内核提交的作者。)