티스토리 뷰

개발/Linux

function kernel_thread()

Jaeyeon Baek 2011. 12. 15. 08:21

kernel thread는 프로세스로서 프로세스와 마찬가지로 프로세스 ID(pid)가 할당되며 자신만의 실행 컨텍스트를 가집니다. thread의 특징은 오직 커널 공간에서만 존재(커널 코드를 자유롭게 부를 수 있다는 장점을 의미)하고 주소 공간을 가지지 않으며 다른 Kernel Thread에 의해서만 생성 가능하다는 점 입니다. 또한 프로세스 이므로 사용자 프로세스와 마찬가지로 시스템 콜을 부를 수가 있습니다. 즉 Kernel Thread는 커널 영역과 시스템 콜에 자유롭게 접근할 수 있는 커널 모드에서 동작하는 프로세스인 것입니다.

이러한 thread를 생성하는 루틴을 알아보도록 합니다. 우선 Kernel thread를 만들 때 이용되는 함수 원형은 아래와 같습니다.

int kernel_thread (int (*fn)(void *), void *arg, unsigned long flags);
예제코드
int mythread(void *arg)
{
    for (;;) {
         /*  내용 */
         interruptible_sleep_on_timeout (&wq, HZ * 30) // 30 초마다 깨어나서 작업 수행
    }
    return 0;
}

kernel_thread(mythread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND);


flags 의미
CLONE_VM : 부모와 자식 프로세스가 동일한 메모리 공간에서 실행된다.
CLONE_FS : 부모와 자식 프로세스가 동일한 파일 시스템 정보를 공유한다. 이 파일 시스템 정보로는 프로세스의
                   루트 디렉토리와 프로세스의 현재 디렉토리를 나타내는 cwd(current working directory), 파일을
                   만들 때 기본 접근권한인 umask 가 있다.
CLONE_FILES : 부모와 자식 프로세스가 동일한 파일 기술자 테이블을 공유한다. 프로세스가 파일을 열 때마다
                       프로세스의 파일 기술자 테이블에 파일 기술자가 추가되는데, 이를 지정하면 자식 프로세스는 똑
                       같은 파일 기술자를 상속받게 된다.
CLONE_SIGHAND : 부모와 자식 프로세스가 동일한 시그널 핸들러를 공유한다.


'개발 > Linux' 카테고리의 다른 글

데이터 종류에 따른 메모리 영역  (0) 2011.12.22
gdb 옵션  (0) 2011.12.20
offsetof 매크로  (0) 2011.12.05
Kernel ipt_get_entries struct .. size  (0) 2011.12.04
__alignof__, aligned 매크로  (0) 2011.12.02
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday