7

非カーネル インクルードによって定義された機能を含む Linux カーネル (2.6) モジュールをコンパイルすることは可能ですか?

例えば:


カーネルモジュール.h

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>   // printk()
// ...
#include <openssl/sha.h>
// ...

メイクファイル

obj-m := kernelmodule.o
all:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
    $(RM) Module.markers modules.order

私が作成してコンパイルしようとしているカーネル モジュールには、いくつかの openssl インクルード ファイルにある機能が含まれています。

上記の標準の makefile では、Linux ヘッダーの外側にインクルードすることはできません。この機能を含めることは可能ですか? もしそうなら、正しい方向に向けてください.

ありがとう、マイク

4

2 に答える 2

6

私が書いたユーザー空間コードの一部を取り、それをカーネル空間で動作するように変換しました (つまり、kmalloc() などを使用)。それほど難しくありません。ただし、ユーザー空間ではなく、カーネルの C の理解に限定されます。これは、特にさまざまな標準の int 型とわずかに異なります。

ユーザー空間の DSO にリンクするだけでは不可能です。Linux カーネルはモノリシックで、完全に自己完結型です。他の人が指摘したように、ユーザー空間のlibc、ライブラリ、またはその他のビットは使用しません。

9/10 回、カーネルのどこかに必要なものが見つかります。他の誰かがあなたと同じニーズに遭遇し、あなたが望むことをするためにいくつかのモジュールにいくつかの静的関数を書いた可能性が非常に高いです..それらをつかんで再利用するだけです.

暗号の場合、他の人が言ったように、カーネルにあるものを使用してください。注意すべきことの1つは、ビルド時にユーザーが選択した内容に応じて、kconfigで有効にする必要があることです。そのため、依存関係に気をつけて明示してください。モジュールが選択されたときに必要な暗号 API も選択する kconfig のいくつかのエントリをハックする必要がある場合があります。ツリーから構築する場合、これを行うのは少し面倒です。

したがって、一方では「全体的な肥大化を追加しながらコピーして名前を変更するだけ」であり、他方では「完全なカーネルソースが必要であることを人々に伝える」必要があります。これは、モノリシック カーネルに伴う癖の 1 つです。

マイクロカーネルを使用すると、ほとんどすべてがユーザー空間で実行され、一部のドライバーの DSO に対してリンクする心配はありません...それは問題ではありません。コメントでカーネル設計哲学を再開する手がかりとしてその声明をとらないでください。それはこの質問の範囲外です。

于 2009-05-04T07:49:15.497 に答える