11

私はいくつかのLinuxドライバーを移植しようとしてきましたが、Linuxのカーネルバージョン2.4と2.6にはかなりの違いがあることに気づきました。

カーネルの2.4バージョンでは、モジュールプログラミングは次のとおりでした-

#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)      
{ 
printk(KERN_INFO "Hi \n"); 
return 0; 
}

void cleanup_module(void)  
{ 
printk(KERN_INFO "Bye \n"); 
}

ただし、2.6バージョンのカーネルでは、モジュールに対して次のことを行う必要があります-

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

static int hi_init(void)
{
    printk(KERN_ALERT "Hi \n");
    return 0;
}

static void hi_exit(void)
{
    printk(KERN_ALERT "Bye \n");
}

module_init(hi_init);
module_exit(hi_exit);

カーネル2.6でのこのような変更の利点は何ですか?また、Linuxのカーネル2.6でその変更が必要だったのはなぜですか?

4

3 に答える 3

8

新しい関数の定義を見ると:

/* Each module must use one module_init(). */
#define module_init(initfn)                 \
static inline initcall_t __inittest(void)       \
{ return initfn; }                  \
int init_module(void) __attribute__((alias(#initfn)));

/* This is only required if you want to be unloadable. */
#define module_exit(exitfn)                 \
static inline exitcall_t __exittest(void)       \
{ return exitfn; }                  \
void cleanup_module(void) __attribute__((alias(#exitfn)));

適切なボイラープレートが含まれていることを確認できるため、これらの特殊な関数をコンパイラで正しく処理できます。これは Linux の内部 API が行うことであり、問​​題を解決するためのより良い方法があれば進化します。

于 2010-07-10T14:25:35.310 に答える
5

カーネル 2.6 の [module_init] の利点は何ですか?

module_initまた、2.4 で終了しました。

モジュールファイルがモジュールとしてではなくカーネルにコンパイルされるときに、モジュールを初期化し、エントリ関数を実行するために必要なボイラープレートを追加します。

于 2010-11-21T14:41:28.530 に答える
1

1 つの利点は読みやすさです。cdrom_init() は、それが cdrom ドライバーの init() 呼び出しであることを即座に伝えます。

于 2010-07-11T14:02:28.313 に答える