8

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で作成する計画。

4

2 に答える 2

4

SBCLのファイルシステムドライバーの操作に関するBradBeveridgeによる2008年2月2日のlispvanトーク「DoingEvilThingswithCommonLisp」をご覧ください。

トークの説明とファイル

その中で彼は次のように述べています。

「CLで書かれたAC/C++デバッガ??

今、完全に空にパイ

しかし、それはどれほどクールでしょうか?

それほど大きな問題ではありません。ライブラリが配置されているメモリに書き込み、ブレークポイントを挿入してからLisp側で信号をトラップできるようにする必要があります。

汚いトリックを使ってC関数をLisp関数の呼び出しに置き換えることができます

いくつかの詳細を除けば、それはおそらくそれほど難しいことではありません–確かに「新しい」ものは何もありません</ p>

汚いトリックは、別のジャンプ(リンクのないブランチ)でCコードをLispコールバックに上書きすることを含みます。Lispコードが戻ると、リンクレジスタを介して元の呼び出し関数に直接戻ることができます。

また、デバッガーを作成する際の実際の難しさについては、完全に理解していません。時間がかかるでしょう。」

于 2012-09-19T07:54:37.983 に答える
2

いいえ、CLにカーネルモジュールを実装することは現実的ではありません。その理由は明らかです。そのためには、多くのハックを行う必要があり、lisp言語が提供するすべての利点が失われ、lispコードが表示される可能性があります。 S式のCコードのように。

カーネルモジュールを作成して、カーネルから必要な機能/データをエクスポートし、ioctlまたは読み取り/書き込み操作を使用して、任意のユーザーモードプログラムがモジュールと通信できます。

Lispでコードを記述し、この汎用モジュールがlispコードを読み取り、それをサブコンポーネント、基本的にはカーネルとして実行するように、Lispを実装するのに十分な汎用性のあるカーネルモジュール(またはそのサブセットである可能性があります)があるかどうかはわかりません- >汎用lispモジュール->lispコード(カーネルで実行されます)。

于 2012-09-19T07:20:48.153 に答える