是否可以在Common Lisp中为Intel x86-64编写Linux内核模式调试器,以及使用哪个Common Lisp实现[s]?

nrz*_*nrz 7 c lisp assembly common-lisp linux-kernel

我有兴趣在Common Lisp中为x86-64开发某种ring0内核模式调试器,它将作为Linux内核模块加载,而且我更喜欢Common Lisp to C in general programming,我想知道不同的Common Lisp实现会如何适合这种编程任务.

调试器将使用一些外部反汇编库,例如通过某些FFI的udis86.在我看来,最简单的方法是在C中编写内核模块,因为它们需要包含C函数和(Linux内核模块编程指南),因此kernel-land模块代码将使用CFFI从C调用Common Lisp代码.我们的想法是为64位Linux创建一个ring0调试器,其灵感来自于Rasta Ring 0调试器的概念,该调试器仅适用于32位Linux并且需要PS/2键盘.我认为最具挑战性的部分是具有硬件和软件断点以及低级视频,键盘或USB输入设备处理的实际调试器代码.内联汇编对此有很大帮助,在我看来,在SBCL中内联汇编可以通过使用VOP(SBCL内部:VOP)(SBCL内部:添加VOP)来实现,而这个IRC日志提到了ACL(Allegro Common Lisp) ,CCL(Clozure Common Lisp)和CormanCL都有LAP(Lisp汇编程序).ACL和CormanCL都是专有的,因此被丢弃,但CCL(Clozure Common Lisp)可能是一种选择.构建独立可执行文件的能力也是一项要求; 我目前正在使用的SBCL有它,但由于它们是完整的Lisp图像,它们的大小非常大.int init_module(void)void cleanup_module(void)

我的问题是:在Common Lisp中为Intel x86-64创建ring0内核模式调试器是否可行,在C和/或汇编中实现低级代码,如果是,则为64位的Common Lisp实现Linux最适合这种努力,如果有多个合适的Common Lisp实现,有什么优缺点?如果它比Common Lisp提供了一些好处,那么S​​cheme也可以是一种可能的选择.我很清楚绝大多数内核模块都是用C语言编写的,我知道C和x86组件足够好,能够在C和/或汇编中编写所需的低级代码.这不是尝试将Linux内核移植到Lisp中(参见:https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lisp),但是计划写入Common Lisp是一个Linux内核模块,可用作ring0调试器.

Ank*_*kur 2

不,在 CL 中实现内核模块是不可行的,原因很明显,为了实现这一点,您需要进行大量修改,并且最终可能会失去 lisp 语言提供的所有好处,并且您的 lisp 代码将看起来像就像 S 表达式中的 C 代码一样。

编写内核模块以从内核导出所需的任何功能/数据,然后使用 ioctl 或读/写操作,任何用户模式程序都可以与该模块进行通信。

我不确定是否有任何足够通用的内核模块可以实现 Lisp (或者可能是它的子集),以便您在 Lisp 中编写代码,并且这个通用模块读取 Lisp 代码并将其作为子组件运行,基本上是内核 - > 通用 lisp 模块 -> 你的 lisp 代码(将在内核中运行)。

  • +1 用 C 实现内核模块代码,用 Common Lisp 实现用户层代码将是一个不错的选择。然而,我发现 [ECL (Embedded Common-Lisp)](http://ecls.sourceforge.net/) 支持内联 C 并编译为独立的可执行文件,这是任何 CL 实现的两个最重要的要求,所以我首先尝试使用内联 C 进行 ECL。 (2认同)