Guillermo Austin Kim

Sources

Posts

998 posts

[라즈베리파이] 시그널 - 커널 공간 시그널 함수 분석

Guillermo Austin Kim|2018년 12월 10일

시그널과 연관된 동작을 변경하면 유저 공간에서 sigaction() 함수를 호출하면 됩니다. 이 함수를 호출하면 시스템 콜 핸들러인 sys_rt_sigaction() 함수가 실행하며 커널 공간에서 시그널을 설정합니다. 이 실행 흐름을 표현하면 다음 그림과 같습니다. 유저 공간에서 sigaction() 함수를 호출하면 커널 공간에서 sys_rt_sigaction() 함수를 호출합니다. 유저 공간에서 sigaction() 함수를 호출하면 커널 공간에서 sys_rt_sigaction() 함수가 어떻게 실행하는지 바로 이해하기 어렵습니다. 이 과정을 조금 더 자세히 정리하면 다음과 같습니다.[유저 공간]1. r7에 sys_rt_sigaction() 함수에 해당하는 시스템 콜 번호인 174를 지정2. “sv

[라즈베리파이] 시그널 - 시그널 관련 시스템 콜 함수 소개

Guillermo Austin Kim|2018년 12월 5일

시그널 관련 시스템 호출 함수는 다음과 같습니다.함수 이름 동작 시스템 콜 핸들러kill 쓰레드 그룹에 시그널을 보냄 sys_killtkill 프로세스에 시그널을 보냄 sys_tkilltgkill 특정 쓰레드 그룹에 있는 프로세스에게 시그널을 보냄 sys_tgkillsigaction 시그널 속성 설정 sys_rt_sigactionsigpending 펜딩된 시그널이 있는지 점검 sys_rt_sigpendingsigprocmask 블록되어 있는 시그널 집합을 수정 sys_rt_sigprocmasksigsuspend 시그널을 기다림 sys_rt_suspendpause 시그널을 수신할 때 까지 기다림 sys_pause 가장 왼쪽

[라즈베리파이] 시그널 - 커널 공간에서 시그널 설정은 어떻게 할까?

Guillermo Austin Kim|2018년 12월 5일

이전 시간에서 유저 프로세스에서 시그널을 설정하는 코드를 살펴봤습니다. 이번 시간에는 커널에서는 시그널을 설정하면 어떤 동작을 하는지 살펴보겠습니다. 유저 프로세스가 시그널 설정을 위해 리눅스 표준 함수를 쓰면 시스템 콜을 발생해서 해당 시스템 콜 핸들러를 실행합니다. sigaddset()와 같이 시그널 자료구조만 변경하는 함수는 시스템 콜을 발생하지 않고 커널에 시그널 설정을 요청하는 sigaction() 함수나 시그널을 기다리는 pause() 와 같은 함수를 호출할 때 시스템 콜을 발생합니다.

[라즈베리파이] 시그널 - 유저 공간 시그널 설정은 어떻게 할까?

Guillermo Austin Kim|2018년 12월 3일

이번 시간에 절에서는 시그널을 설정하면 유저 공간에서 커널 공간까지 어떤 흐름으로 처리하는지 소스 코드를 보면서 살펴 보겠습니다. 유저 레벨 프로세스에서 시그널 설정을 어떻게 하는지 소스 코드와 함께 살펴봅시다. 유저 공간에서 시그널을 설정하는 간단한 코드입니다.1 #include 2 #include 3 #include 4 #include 56 void sig_handler(int signum) {7 switch(signum) {8 case SIGINT:9 printf("sig num [%d] \n", signum);10 break;11 12 case SIGALRM:1

[라즈베리파이] 시그널 - 커널에서 시그널은 어떻게 처리할까?

Guillermo Austin Kim|2018년 12월 2일

리눅스 커널 입장에서 시그널은 프로세스 간 통신을 위한 간단한 인터페이스입니다. 커널은 상황에 따라 시그널을 생성하고 전달해주는 역할을 수행합니다. 리눅스 커널에서 시그널에 대한 처리는 2단계로 나눌 수 있습니다. 1> 시그널 생성유저 공간에서 시그널을 설정하면 커널은 해당 프로세스의 태스크 디스크립터에 시그널 정보를 써줍니다. 시그널을 받을 프로세스 스택 최상단 주소에 있는 struct thread_info flags 멤버에 _TIF_SIGPENDING 매크로를 써 줍니다. 시그널을 받을 프로세스에게 누군가 시그널을 생성했고 해당 시그널이 전달될 것이라고 알려주는 것입니다. 이후 시그널을 받을 프로세스를 깨웁니다. 2> 시그널 처리시그널을 받을 프로세스가 시스템 콜이나 인터럽트 처리를 마무