Armv8 Signal

EEEFFEE·2023년 11월 30일
0

Armv8 Architecture

목록 보기
12/15

23.11.30 최초 작성

1. 시그널 처리 흐름

  1. 시그널 생성

    • 시그널을 받을 프로세스의 태스크 디스크립터에 시그널을 받을 것이란 정보 저장하고 프로세스를 깨움

    • 시그널 받을 프로세스의 thread_info 구조체의 flags필드에 _TIF_SIGPENDING플래그 포함

    • wake_up_process()함수 호출해서 시그널 받을 프로세스 깨움

    • /source/kernel/signal.c

      • send_signal() : 예외 처리 후 __send_signal() 호출
      • __send_signal() : 태스크 디스크립터의 pending필드에 시그널과 관련된 정보 갱신하고 trace_signal_generate()에서 프로세스를 깨움
  2. 시그널 수신

    • 시그널 받을 프로세스는 시스템 콜이나 인터럽트 처리를 마무리한 시점에서 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() : 전달받은 시그널에 시그널 핸들러가 설정됐으면 실행, 아니면 시그널 종류에 따른 루틴 실행

0개의 댓글