0

freebsd에서 raymond의 알고리즘을 사용하여 분산 상호 배제에 대한 지원을 구축 할 과제가 있습니다.freebsd (+ networking)에서 커널 스레드를 사용하는 올바른 방법

이렇게하려면 커널 스레드가 다른 시스템의 메시지에 대해 항상 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.cthread_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 모듈을 사용할 준비가 있습니다.

관련 문제