2

我正在寻找有关在内核模块中实现某些 CPU 扩展的信息。我发现了一些相关的东西:http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c事实上,这是我能找到的唯一接近的源代码.

基本上,我有一个使用某些 CPU 扩展构建的仅二进制共享对象,我需要在具有大部分指令集但不是花哨的新东西的稍旧的 CPU 上运行它。是的,我知道这会很慢,但总比因为 SIGILL 崩溃要好。

4

4 回答 4

2

我认为你可以在用户区做到这一点。SIGILL为with安装处理程序sigaction()并指定SA_SIGINFO. si_code中的字段siginfo_t允许区分 的几个原因SIGILL。例如,在信号来自时尝试模拟指令kill()是没有意义的。处理程序的第三个参数指向一个包含故障时 CPU 上下文的结构(参见文档)。您可以修改它并从信号处理程序返回,更改生效;如果这不起作用,请尝试setcontext().

显然,它会比在内核中做的效率低一点,但更干净、更安全。

于 2010-08-06T12:52:45.423 回答
2

你可以这样做,但它有点痛苦。无效的操作码需要被拦截,所以要么需要修改现有的非法指令处理程序,要么将处理程序包装起来,既脏又复杂。

如果您想避免任何内核模块,而是作为纯内核执行,则包装异常方法可能是唯一的方法。如果您可以修改内核,则补丁处理程序会更好。

于 2013-02-16T23:31:13.160 回答
1

我认为您无法使用内核模块解决此问题。我认为您要么需要在允许缺少指令的 VM 中运行它(我会尝试使用 XEN),要么需要重新编译对象以使其不使用它们。

于 2010-08-05T23:34:05.957 回答
1

好吧,在阅读了内核源代码之后,似乎已经有了对此的少量支持。我真的看不出它实际使用了多少,但是存在一个链表来存储各种模拟指令。如果我能够真正做到这一点,我可能会将其更改为内核头提供的树。

如果我对内核模块的理解正确,那么支持可插拔仿真似乎不会有问题。

于 2010-11-17T02:33:12.877 回答