我正在寻找有关内核模块在执行某些CPU扩展的信息。我发现有关的东西: HTTP:/ /www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c 事实上,它是唯一的源代码,我可以发现,甚至关闭。

基本上,我有一个二进制与某些CPU的扩展,我需要拥有大部分的指令集的一个年龄稍大的CPU上运行,只建共享对象,而不是花哨的新东西。是的,我知道这将是相当缓慢的,但它的效果优于SIGILLs崩溃。

有帮助吗?

解决方案 4

好了,阅读内核源代码之后,好像已经有这个轻微的支持。我实在看不出它是多么的实际使用,但存在一个链表来存储各种仿真指令。如果我能够真正得到这是怎么回事,我可能会改变它的内核头提供的树。

如果我理解内核模块右侧,有看起来并不像会有支持可插拔仿真的问题。

其他提示

我觉得你可以在用户态做到这一点。安装与SIGILL sigaction()的处理程序,并指定SA_SIGINFO。在si_code领域siginfo_t允许SIGILL的几个原因区别。例如,试图仿效的指令时将信号从kill()出来没有意义。第三个参数给处理程序指向包含在故障(见文档)的时间的CPU的上下文的结构。你可以很可能修改这一点,从信号处理程序返回时,变更生效;如果不工作,尝试setcontext()

显然,这将是一个比特比在内核做效率较低,但更清洁和更安全。

您可以做到这一点,但它的轻微的疼痛。无效的操作码需要被截取,那么您可能需要修改现有的非法指令处理程序,或包裹处理程序,它是脏和复杂的。

如果你想避免任何内核MODS的,但做一个纯粹的内核,包裹的异常的方法可能是做到这一点的唯一途径。如果你可以修改内核,补丁的处理程序是更好的。

我不认为你可以使用一个内核模块解决这个问题。我认为你要么需要在一个虚拟机,它允许丢失的指令运行这个(我会尝试使用XEN)或重新编译对象,以便它不会使用它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top