LinuxカーネルモジュールとしてロードされるCommonLispでx86-64用のある種のring0カーネルモードデバッガーを開発することに興味があります。一般的なプログラミングではCよりもCommonLispを好むので、CommonLispの実装はどのように異なるのでしょうか。この種のプログラミングタスクに適合します。
デバッガーは、 FFIを介したudis86などの外部逆アセンブルライブラリを使用します。カーネルモジュールはC関数と(Linuxカーネルモジュールプログラミングガイド)を含む必要があるため、Cで記述するのが最も簡単なようです。したがって、kernel-landモジュールコードはCFFIを使用してCからCommonLispコードを呼び出します。アイデアは、ラスタリング0デバッガーのアイデアに触発された64ビットLinux用のring0デバッガーを作成することです。int init_module(void)
void cleanup_module(void)
、これは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)が1つのオプションになる可能性があります。スタンドアロンの実行可能ファイルを構築する能力も要件です。私が現在使用しているSBCLにはそれがありますが、Lisp画像全体であるため、サイズがかなり大きくなっています。
私の質問は、CommonLispでIntelx86-64用のring0カーネルモードデバッガーを作成し、Cやアセンブリで低レベルのコードを実装することは可能ですか?もしそうなら、64ビット用のCommonLisp実装はどれですか? Linuxはこの種の取り組みに最適であり、適切なCommon Lisp実装が複数ある場合の長所と短所は何ですか?Common Lispに比べていくつかの利点がある場合は、Schemeも1つの可能なオプションになります。カーネルモジュールの大部分がCで記述されていることをよく知っています。また、必要な低レベルコードをCやアセンブリで記述できるように、Cおよびx86アセンブリを十分に理解しています。これは、LinuxカーネルをLispに移植する試みではありません(https://stackoverflow.com/questions/1848029/why-not-port-linux-kernel-to-common-lispを参照)。)が、ring0デバッガーとして使用されるLinuxカーネルモジュールをCommonLispで作成する計画。