2010-08-05 29 views
2

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

基本上,我有一定的CPU扩展,这是我需要拥有大部分的指令集的一个年龄稍大的CPU上运行内置的二进制只有共享对象,而不是花哨的新东西。是的,我知道它会比较慢,但是比用SIGILL碰撞要好。

+0

您的链接已损坏... – luke 2010-08-05 23:34:26

+0

Shazbot!修正了谢谢。 – joe 2010-08-06 00:37:31

+0

我认为你的问题可能有点过分。你已经有了基本的想法 - 拦截最终导致SIGILL的陷阱,而是检查用户进程状态并模拟它试图执行的指令。 (我认为你不能从一个模块中完成它 - 它可能必须被编译进去,除非你为模块添加一些垫片来连接)。那么真正的问题是什么? – caf 2010-08-06 02:26:54

回答

1

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

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

1

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

+0

我认为@joe的意思就像旧FP处理器上使用的FP模拟技巧一样。我不确定任何人现在正在对此进行研究。 – 2010-08-05 23:41:08

+0

外部FP单元实际上是大图的第二部分。但是当我来的时候,我会搞砸的。下面是一个x86示例(目标CPU是ARM):如果CPU不支持SSE2,当它遇到ADDPD指令时,内核会抛出(或其他类似过滤器,以较快者为准)内部SIGILL为自己捕获(内核模块等),然后调用实现ADDPD的特定函数。它不一定是一个内核模块,它可能是内核框架必须写入,这很好。 – joe 2010-08-06 00:01:37

2

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

显然,这将是一个有点不是内核做效率较低,但更清洁,更安全。

2

你可以做到这一点,但它有点痛苦。需要拦截无效的操作码,因此您需要修改现有的非法指令处理程序,或者包装处理程序,该处理程序很脏并且很复杂。

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