0

私の問題は、カーネルにドライバーをビルドしようとしていることです。簡単な Hello World プログラムでコードをテストすることにしました。コードは次のようになります。

#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/printk.h>

int __init my_init(void)
{
    printk(KERN_ALERT "Hello world\n");
    return 0;
}

device_initcall(my_init);
//subsys_initcall(my_init);

また、 cat /proc/sys/kernel/printk は 7 4 1 7 を示します .config ファイルから、「CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4」を見つけます

Makefile で obj-y += を使用してファイルを作成しています。「make」でモジュールをビルドできることがわかりましたが、ブート後に dmesg または /var/log/ の下に printk 出力が表示されません。

ドライバーがカーネルにまったく組み込まれていないのではないかと思っています。それを確認する方法はありますか?

ありがとう。

4

2 に答える 2

1

私は問題を解決しました。printkステートメントが実際にコンソールに出力されていることがわかりましたが、他の多数のメッセージが出力されたため、dmesgから消去されました。dmesgのサイズを大きくし、printkステートメントを保存するようになりました。

于 2012-07-02T19:29:33.660 に答える
1

使用できます

lsmod command
    OR
cat /proc/modules

コマンドを実行して、ドライバーがロードされているかどうかを確認します。

あなたのコードを見ると、__init を module_init または __initcall に置き換える必要があると思います。これらのカーネル署名により、挿入時にモジュール init が呼び出されることが保証されます。

insmod を使用してドライバーをテストし、dmesg を呼び出してメッセージがログに記録されるかどうかを確認できます。

于 2012-07-02T06:18:01.567 に答える