Linux カーネルに新しい機能を追加したいと考えています。これを実装するには、カーネルの別の部分から名前でアクセスできる構造を追加する必要があります。
どうすればいいですか?
Linux カーネルに新しい機能を追加したいと考えています。これを実装するには、カーネルの別の部分から名前でアクセスできる構造を追加する必要があります。
どうすればいいですか?
module.h で構造を宣言すると、カーネル内のすべてのモジュールがコンパイルされます。ローカル ディレクトリでヘッダー ファイルを選択するか、ローカル ディレクトリで構造を定義する新しいヘッダーを作成することをお勧めします。あなたのコンポーネントはカーネルの一部になると言ったので、acファイルで構造変数を宣言し、 extern 修飾子でいつでもどこでもそれを使用してください。これには、sysmbol のエクスポートは必要ありません。以下のようになります。
kernel/test.h:
struct test {
char name[10][20];
};
kernel/workqueue.c:
struct test *test_list;
some_fun()
{
test_list = kmalloc(sizeof(struct test) * 2, GFP_KERNEL);
}
kernel/softirq.c:
extern struct test *test_list;
printk(KERN_INFO "%s\n", test_list[0].name[0]);
私はカーネルの専門家ではありませんが、グローバルに表示されるシンボルを使用しないようにして、関数ベースの API を提供することをお勧めします (パフォーマンスが重要な少数のユーザー向けに、インライン化された関数を使用する可能性があります)。
関数のセットのみを定義することをお勧めします。また、グローバル データを提供することが良い考えかどうかもわかりません。特にマルチコア マシンでは同期の問題である可能性があります [現在、ほとんどのシステムには少なくとも 2 つのコアがあります]。したがって、一連の関数インターフェイスを定義し、それらを適切に文書化し (少なくとも適切なコメントを付けて)、グローバル データを避ける方がよいでしょう。
また、カーネルの一部 (またはサブシステム) からインスピレーションを得ることをお勧めします。これは、達成したいものに似ている可能性があります。また、設計段階の早い段階でも、カーネル コミュニティからアドバイスを受けることをお勧めします (特に、コメントを有効にするために、コードが動作する前であってもコードを公開してください)。
幸運を。どのような種類のサブシステムまたは機能を実装しようとしているのかを理解しておくとよいでしょう。
EXPORT_SYMBOL
構造変数をエクスポートするために使用します。カーネルコードとモジュール全体で見られます
あなたの質問を理解したかどうかわかりません。私の理解によると、
新しいユーザー定義構造を定義しようとしていて、それらを必要な場所で使用したいと考えています。また、それを定義する共通の場所を探しています。右??
すべてのカーネル モジュールにlinux/module.h
. ここに構造を追加できます。これがすべてのモジュールでアクセスできることを願っています。