カーネル コードの一部で使用する前に、カーネル リンク リストを試してみたいと思います。しかし、単に含めるlist.h
と、依存関係のために機能しません。
single.c
コンパイルするだけでコードをテストできるように、test.c などのファイルで list を使用してコードを作成するにはどうすればよいtest.c
ですか? あなたからのお便りを楽しみにしています。
また、ネストされたリンクリストを使用するにはどうすればよいですか?
http://www.mcs.anl.gov/~kazutomo/list/list.hからユーザー空間ポートを取得できます。
それは言います:
これは、ユーザー空間プログラムの list.h をクックするレシピです。
- linux/include/list.h から list.h をコピーします。
- 削除する
- #ifdef KERNEとその #endif
- すべて #include 行
- prefetch() および rcu 関連の関数
- マクロ offsetof() と container_of を追加
リストはカーネル内で使用するために作成されており、カーネル タイプなどのいくつかの依存関係があるため、ユーザー空間でリストを使用することは意図されていません。これは、正しいインクルード パスを使用してコードをコンパイルすることで確認できます。
gcc -I path-to-kernel-src/include/ test.c
test.c に次のコードが含まれている場合:
#include <stdio.h>
#include <stdlib.h>
#include <linux/list.h>
int main(int argc, char **argv) { }
ユーザー空間のインクルード (stdlib.h) と競合する list.h にインクルードがあるため、コンパイルに失敗します。
それにもかかわらず、リストのようなデータ構造の依存関係はかなり小さいです。list.h の依存関係を他のカーネルから切り離すには、それらを整理する必要があります。簡単なテストでは、list.h との間のインクルードを削除し、データ型構造体 list_head/hlist_head と hlist_node を追加しました。