我希望开发一种针对x86-64的ring0内核模式调试器,使用Common Lisp编写并作为Linux内核模块加载。由于我更喜欢使用Common Lisp进行一般编程,因此我想知道不同的Common Lisp实现如何适用于这种编程任务。
调试器将使用一些外部的反汇编库,例如 udis86 通过一些 FFI。在我的看法中,用 C 写内核模块最容易,因为它们需要包含 C 函数
我的问题是:是否可以使用Common Lisp创建一个针对Intel x86-64的ring0内核模式调试器,其中低级别代码采用C和/或汇编实现?如果可以,哪些64位Linux的Common Lisp实现最适合这种尝试,并且如果有多个适合的Common Lisp实现,有什么利弊?如果Scheme相比Common Lisp提供了一些优势,那么它也可以是一种可能的选择。我很清楚大多数内核模块都是用C编写的,我也很熟悉C和x86汇编,足以能够用C和/或汇编编写所需的低级别代码。这不是将Linux内核移植到Lisp的尝试(参见:https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lisp),而是计划在Common Lisp中编写一个Linux内核模块,该模块将用作ring0调试器。
调试器将使用一些外部的反汇编库,例如 udis86 通过一些 FFI。在我的看法中,用 C 写内核模块最容易,因为它们需要包含 C 函数
int init_module(void)
和 void cleanup_module(void)
(The Linux Kernel Module Programming Guide),所以内核空间模块代码将使用 CFFI 从 C 中调用 Common Lisp 代码。该想法是创建一个 64 位 Linux 下的 Ring0 调试器,灵感来自于 Rasta Ring 0 Debugger 的想法,它仅适用于 32 位 Linux 并需要 PS/2 键盘。我认为最具挑战性的部分将是实际的调试器代码,包括硬件和软件断点以及低级视频、键盘或 USB 输入设备处理。内联汇编会在这方面有很大帮助,似乎在 SBCL 中可以通过使用 VOPs (SBCL Internals: VOP) (SBCL Internals: Adding VOPs) 实现内联汇编,并且这个 IRC log 提到 ACL (Allegro Common Lisp)、CCL (Clozure Common Lisp) 和 CormanCL 都有 LAPs (Lisp Assembly Programs)。ACL 和 CormanCL 都是专有软件,因此被丢弃了,但 CCL (Clozure Common Lisp) 可能是一个选择。构建独立可执行文件的能力也是一个要求;我目前使用的 SBCL 有这个功能,但它们是整个 Lisp 映像,所以大小相当大。我的问题是:是否可以使用Common Lisp创建一个针对Intel x86-64的ring0内核模式调试器,其中低级别代码采用C和/或汇编实现?如果可以,哪些64位Linux的Common Lisp实现最适合这种尝试,并且如果有多个适合的Common Lisp实现,有什么利弊?如果Scheme相比Common Lisp提供了一些优势,那么它也可以是一种可能的选择。我很清楚大多数内核模块都是用C编写的,我也很熟悉C和x86汇编,足以能够用C和/或汇编编写所需的低级别代码。这不是将Linux内核移植到Lisp的尝试(参见:https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lisp),而是计划在Common Lisp中编写一个Linux内核模块,该模块将用作ring0调试器。