1

Linux のマニュアル ページのセクション 2 には、system calls.

http://linux.die.net/man/2/

このリンクを見つけた後、私は「OK! すべてのモジュールの開発にこのリファレンスを使用しています。完成しました」と言います。

しかし、このセクションの一部の機能 ( など) を使用できないようbind(2)です。必要なヘッダー ( など<sys/socket.h>) を含めた後、モジュールのコンパイルに失敗しました。

一部の関数/マクロなどprintkは、セクション 2 には記載されていません。多くの人が Linux Api を使用していたため、公式のリファレンスが見つかりませんでした (のようにprintk)。彼らがこれらの機能をどのように見つけたのかわかりませんか?(リファレンスを読むのではなく、カーネルのソースコード全体を読むことによるかもしれません)

セクション 3 (ユーザー空間ライブラリ) で説明したような関数もmemsetありますが、カーネル モジュールの開発者はエラーなく使用できます。

ロード可能なカーネル モジュールを開発する際に利用可能なヘッダー関数の完全なリファレンスはどこにありますか? (MSDN や WINDDK 参照のようなもの)

#include <linux/init.h>
#include <linux/module.h>

/* A complete list of availabe headers and functions is missing! */

static int my_init(void)
{
    return  0;
}

static void my_exit(void)
{
    return;
}

module_init(my_init);
module_exit(my_exit);
4

2 に答える 2

4

ご存知のように、カーネルは非常に大きく、独立した獣です。これは、カーネル ソース ツリーにないものを含めることができないことを意味します。

モジュールを実装しているとき、リンクできるのは に入っているものだけです:

  • カーネル ソース ツリー自体
  • あなたが作成した別のモジュール (可能な限りこのシナリオを避けることをお勧めします...)

関数は、エクスポートされた場合にのみ使用できることに注意してください。nmこれは、モジュールのコンパイル済み.koファイルでユーティリティを使用して確認できます。モジュールの一部のシンボルをエクスポートする場合は、マクロEXPORT_SYMBOLを使用する必要があります。

ユーザー空間のインクルードを混同しないように注意してください。通常は /usr/include の下にあり、カーネル モジュール ヘッダー (おそらくリンク先) に含まれています。

あなたが示した例では、sys/socket.hは .h の後のヘッダーの場所ですmake headers_install。この場所では、ユーザー空間アプリケーションによって使用されることを意図しています。これは、モジュールをプログラミングするときに必要なものではありません。

カーネルでのソケットの使用について、より深く調べる必要があると思います。少しグーグルで検索して、LWN で-> this <-を見つけ、3.8 カーネル ソース ツリーのinclude/linux/net.hヘッダーを確認しました。リンクに記載されているパッチはカーネルに統合されており、探しているものである可能性があります。

memsetの例は、これまで説明してきたことの説明でもあります。一般的なアプリケーションで使用する場合は、 /usr/ include /string.h にあるstring.hヘッダーをインクルードする必要があります。 . 同等のカーネルは ... の下にあります。

/your-kernel-source-tree-dir/include/linux/string.h

出来上がり!正しいヘッダーを含める限り、任意のカーネル コード内でmemsetとその仲間を使用できます。

したがって、フラストレーションを感じたときは、このヘッダーをアプリに含めるだけでこれを使用できました...カーネルソースツリーを詳しく見てgrepください(または、あなたのためにそれをしてもらいました;))。あなたが探しているものが見つかる可能性が非常に高いです!

于 2013-06-24T08:59:40.873 に答える
2

私の知る限り、カーネル モジュール プログラミングに関する完全なリファレンスはありません。LDD3 の基本セクションと、初心者向けの http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN978を学習することをお勧めします。

于 2013-06-24T11:05:08.370 に答える