我正在寻找有关在内核模块中实现某些CPU扩展的信息。我发现了一些相关内容:http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c实际上,它是我能找到的唯一源代码,甚至很接近。
基本上,我有一个仅使用某些CPU扩展构建的二进制共享对象,我需要在稍微较旧的CPU上运行,该CPU具有大部分指令集,但不是新奇的东西。是的,我知道它会相当慢,但它比使用SIGILLs更好。
答案 0 :(得分:2)
我认为你可以在userland中这样做。使用SIGILL
安装sigaction()
的处理程序并指定SA_SIGINFO
。 si_code
中的字段siginfo_t
可以区分SIGILL
的多个原因。例如,当信号来自kill()
时尝试模拟指令没有意义。处理程序的第三个参数指向包含故障时CPU上下文的结构(请参阅文档)。您可以修改它并从信号处理程序返回,更改生效;如果这不起作用,请尝试setcontext()
。
显然,它在内核中的效率要低一些,但更清晰,更安全。
答案 1 :(得分:2)
你可以做到这一点,但它有点痛苦。无效的操作码需要被拦截,因此您需要修改现有的非法指令处理程序,或者包装处理程序,这是脏的和复杂的。
如果你想避免任何内核mod,但是作为纯内核,包裹异常方法可能是唯一的方法。如果你可以修改内核,修补的处理程序会更好。
答案 2 :(得分:1)
我认为您无法使用内核模块解决此问题。我认为你需要在一个允许缺少指令的VM中运行它(我会尝试使用XEN)或重新编译该对象,以便它不使用它们。
答案 3 :(得分:1)
好吧,在阅读了内核源代码后,似乎已经有了很少的支持。我真的看不出它实际使用了多少,但是存在一个链接列表来存储各种模拟指令。如果我能够真正实现这一目标,我可能会将其更改为提供的kernel-header树。
如果我正确理解内核模块,那么支持可插拔仿真似乎不会有问题。