0

freebsdのraymondのアルゴリズムを使って、分散相互排除のサポートを構築する課題があります。freebsd(+ネットワーキング)のカーネルスレッドを使う正しい方法

これは、他のシステムからのメッセージのために常にudpポートをリッスンし、それに応じて動作するカーネルスレッドが必要です。

私はthread_createを使ってスレッドを作成していますが、socreateを呼び出すたびにカーネルパニックが発生します。 私がやっていることをやり遂げる最良の方法は何ですか?私はfreebsdのカーネルネットワークに関する良いチュートリアルを見つけることができませんでした。

別の点として、mainproc変数が正しく設定されていない可能性があります。現在のstruct proc*またはstruct thread*を調べるにはどうすればよいですか?

私の現在のコードは次のようである:

static struct proc *mainproc; 
static int val; 
static int main_thread_finish; 

static struct socket *listenso; 
static struct sockaddr_in listenadr; 

static void main_thread(void* data) 
{ 
    static int res; 
    printf("In thread\n"); 
    res = socreate(AF_INET, &listenso, SOCK_DGRAM, IPPROTO_UDP, mainproc->p_ucred, mainproc->p_singlethread); 
    printf("socreate res: %d\n", res); 

    listenadr.sin_family = AF_INET; 
    listenadr.sin_port = htons(1234); 
    listenadr.sin_addr.s_addr = 0; 
    res = sobind(listenso, (struct sockaddr*)&listenadr, mainproc->p_singlethread); 
    printf("bind res: %d\n", res); 

    while(!main_thread_finish) 
    { 
      pause("DUMMY", hz); 
    } 
    printf("kthread exiting...\n"); 
    kthread_exit(); 
} 

static int 
raymond_module_load(struct module *module, int cmd, void *arg) 
{ 
    int error = 0; 

    switch (cmd) { 
    case MOD_LOAD : 
      val = 12345; 
      main_thread_finish = 0; 
      kproc_create(main_thread, NULL, &mainproc, 0, 0, "raymond_main_thread"); 
      printf("Module loaded - kthread created\n"); 
      break; 
    case MOD_UNLOAD : 
      main_thread_finish = 1; 
      printf("Waiting for thread to exit...\n"); 
      pause("TWAIT", 3*hz); 
      printf("Module unload...\n"); 
      break; 
    default : 
      error = EOPNOTSUPP; 
      break; 
    } 
    return (error); 
} 

static moduledata_t raymond_module_data = { 
    .name = "raymond_module", 
    .evhand = raymond_module_load, 
    .priv = NULL }; 

DECLARE_MODULE(raymond_module, raymond_module_data, SI_SUB_KLD, SI_ORDER_ANY); 

答えて

1

mainproc->p_singlethreadNULLなので、socreateパニックの呼び出しです。この変数は、プロセスに関連するスレッドではなく、プロセス内で「シングルスレッド」を実行するために使用されます(詳細はsys/kern/kern_thread.cの関数thread_single()を参照してください)。

はおそらく、あなたがやりたいことcurthread

res = socreate(AF_INET, &listenso, SOCK_DGRAM, IPPROTO_UDP, 
      curthread->td_ucred, curthread); 
... 
res = sobind(listenso, (struct sockaddr*)&listenadr, curthread); 
を使用していたました
1

はのnetgraphを使用することを検討して、それがng_ksocketモジュールを使用する準備ができています。

関連する問題