私はLove's Linux Kernel Developmentの構文のいくつかに従おうとしましたが、次のような単純化されたセマフォの初期化に少し難しいことがあります。カーネルのコンパイル中に、「エラー:予想される宣言指定子または「&」マークの前に「...」が表示されます。これは私のsema_init()呼び出しを関数プロトタイプとして扱うように聞こえますが、実際には静的インライン関数呼び出しだけです。
#include <linux/sched.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/kthread.h>
#include <linux/syscalls.h>
#include <linux/pstrace.h>
#include <linux/semaphore.h>
struct semaphore sem1;
int count1 = 3;
sema_init(&sem1,count1);
SYSCALL_DEFINE0(helloworld){
extern struct semaphore sem1;
printk("hello, world\n");
return 0;
}
これを行う方法についての他のアイデアはありますか? (実際には通話でセマフォを使用しないことを知っています。)
ありがとうございます。
答え1
この方法では、関数の外部から関数を呼び出すことはできません。セマフォを初期化するには、__init
次の関数を使用してください。
static int __init helloworld_init(void) {
sema_init(&sem1, 3);
return 0;
}
module_init(helloworld_init);
あなたも同じようにしなければなりません#include <linux/module.h>
。
module_init()
(はい、これは関数の外部で呼び出されるように見えますが、sema_init()
関数でmodule_init()
ありマクロであるため、矛盾するアドバイスのように見えます。)