Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

75235
1036
103645


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

유저 프로세스 입장에서는 시그널은 '비동기적인 중단'입니다. 그런데 커널은 시그널을 유저 프로세스에게 잘 전달하는 역할을 수행합니다. 집배원은 우편물에 적힌 주소를 보고 우편문을 도착지에 잘 전달하는 임무를 맡습니다. 마찬가지로 커널도 유저 프로세스에게 시그널이 잘 전달되는 일을 합니다.

커널은 시그널에 대해 다음과 같은 처리를 합니다. 

    시그널 자료 구조를 업데이트해 시그널을 생성하고 전달해주는 중재자 역할을 수행한다.

리눅스 커널에서 시그널을 처리하는 과정은 2단계로 나눌 수 있습니다.

1 단계: 시그널 생성하기
커널은 시그널을 받을 프로세스에게 시그널을 받을 것이란 정보를 써주고 해당 프로세스를 깨웁니다. 
시그널을 받을 프로세스에게 시그널 정보 써줍니다. 시그널을 받을 프로세스 struct thread_info 구조체 flags 필드에 _TIF_SIGPENDING 플래그를 저장합니다. 시그널을 받을 프로세스에게 누군가 시그널이 생성됐고 시그널이 전달될 것이라고 알려주는 것입니다. 
wake_up_process() 함수를 호출해 시그널을 받을 프로세스를 깨웁니다.

2 단계: 시그널을 받아 처리하기
시그널을 받을 프로세스는 시스템 콜이나 인터럽트 처리를 마무리한 후 시그널을 받아 처리합니다.

커널은 시그널 종류에 따라 유저 프로세스가 정해진 동작을 수행하도록 지원해주는 중재자 역할을 수행합니다. 그런데 2가지 조건에 따라 다른 동작을 수행합니다. 

    유저 어플리케이션에서 시그널 핸들러를 설정했을 경우

커널은 시그널 핸들러를 호출만 해줍니다. 대신 커널은 시그널 종류에 따라 세부적인 처리를 할 수가 없습니다.  

그렇다면 커널은 시그널 핸들러는 어떻게 호출할까요? 유저 어플리케이션에서 지정한 시그널 핸들러 주소를 ARM 프로그램 카운터 정보에 써줍니다. 

    유저 어플리케이션에서 시그널 핸들러를 설정하지 않았을 경우

커널은 중재자가 역할에 그치지 않고 시그널 타입에 따라 프로세스를 처리합니다.
만약 전달된 시그널이 SIGINT, SIGKILL인 경우 프로세스를 종료시킵니다.

#Referene 시그널
시그널이란
시그널 설정은 어떻게 할까
시그널 생성 과정 함수 분석
프로세스는 언제 시그널을 받을까
시그널 전달과 처리는 어떻게 할까?
시그널 제어 suspend() 함수 분석 
시그널 ftrace 디버깅

"혹시 궁금점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답글 올려드리겠습니다!" 

핑백

덧글

댓글 입력 영역