实现一个内核模块中CPU的扩展
-
26-09-2019 - |
题
我正在寻找有关内核模块在执行某些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)或重新编译对象,以便它不会使用它们。