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提供了一些好处,那么Scheme也可以是一种可能的选择.我很清楚绝大多数内核模块都是用C语言编写的,我知道C和x86组件足够好,能够在C和/或汇编中编写所需的低级代码.这不是尝试将Linux内核移植到Lisp中(参见:https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lisp),但是计划写入Common Lisp是一个Linux内核模块,可用作ring0调试器.
不,在 CL 中实现内核模块是不可行的,原因很明显,为了实现这一点,您需要进行大量修改,并且最终可能会失去 lisp 语言提供的所有好处,并且您的 lisp 代码将看起来像就像 S 表达式中的 C 代码一样。
编写内核模块以从内核导出所需的任何功能/数据,然后使用 ioctl 或读/写操作,任何用户模式程序都可以与该模块进行通信。
我不确定是否有任何足够通用的内核模块可以实现 Lisp (或者可能是它的子集),以便您在 Lisp 中编写代码,并且这个通用模块读取 Lisp 代码并将其作为子组件运行,基本上是内核 - > 通用 lisp 模块 -> 你的 lisp 代码(将在内核中运行)。