23.11.30 최초 작성
시그널 생성
시그널을 받을 프로세스의 태스크 디스크립터에 시그널을 받을 것이란 정보 저장하고 프로세스를 깨움
시그널 받을 프로세스의 thread_info
구조체의 flags
필드에 _TIF_SIGPENDING
플래그 포함
wake_up_process()
함수 호출해서 시그널 받을 프로세스 깨움
/source/kernel/signal.c
send_signal()
: 예외 처리 후 __send_signal()
호출__send_signal()
: 태스크 디스크립터의 pending
필드에 시그널과 관련된 정보 갱신하고 trace_signal_generate()
에서 프로세스를 깨움시그널 수신
thread_info
구조체의 flags 필드에 _TIF_SIGPENDING
플래그가 포함됐는지 체크/source/arch/arm64/kernel/entry-common.c
el0_svc()
: 시스템 콜 핸들러 실행이 마무리된 후 exit_to_user_mode()
호출
exit_to_user_mode()
: prepare_exit_to_user_mode()
호출
prepare_exit_to_user_mode()
: thread_info
의 flag필드에 _TIF_SIGPENDING
이 설정됐는지 확인
설정됐으면 do_notify_resume()
호출
/source/arch/arm64/kernel/signal.c
do_notify_resume()
: thread_info
의 flag필드에 _TF_NEED_RESCHED
설정됐으면 schedule()
호출
아니면 do_signal()
호출
do_signal()
: 전달받은 시그널에 시그널 핸들러가 설정됐으면 실행, 아니면 시그널 종류에 따른 루틴 실행