Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

81112
549
416221


[리눅스커널][인터럽트] 인터럽트 컨택스트: in_interrupt() 함수 코드분석 5. 인터럽트

다음 질문을 시작으로 in_interrupt() 함수에 대해 알아보겠습니다. 

현재 실행 중인 코드가 인터럽트 컨텍스트 구간인지 어떻게 알 수 있을까요?

in_interrupt() 함수가 이 정보를 알려줍니다. in_interrupt() 함수가 true를 반환하면 인터럽트 컨텍스트이고, 반대로 false를 반환하면 프로세스 컨텍스트입니다. 

* 아래 강의 동영상에서 관련 내용을 확인할 수 있습니다.





"이 포스팅이 유익하다고 생각되시면 댓글로 응원해주시면 감사하겠습니다.  
"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)

# Reference (인터럽트 처리)

인터럽트 소개  
   * 리눅스 커널에서의 인터럽트 처리 흐름    
인터럽트 컨텍스트  
인터럽트 핸들러는 언제 호출될까?  
인터럽트 핸들러는 어떻게 등록할까?  
인터럽트 디스크립터  
인터럽트 디버깅  

핑백

덧글

  • Daniel 2018/12/14 11:41 # 답글

    만약 어떤 값이 0x210200인데 이 값에 HARDIRQ_MASK(0x10000)와 AND 비트 연산을 하면 결괏값은 0x10000이 됩니다.
    -> 만약 어떤 값이 0x210200인데 이 값에 HARDIRQ_OFFSET(0x10000)와 AND 비트 연산을 하면 결괏값은 0x10000이 됩니다
    로 변경해야 맞지 않은지 문의드립니다.
  • Guillermo 2018/12/14 14:11 #

    좋은 지적 감사드리고, 참 꼼꼼히 글을 읽어주셔서 감사합니다.

    HARDIRQ_MASK는 0xf0000이고 HARDIRQ_OFFSET는 0x10000이며 각각 이진수는 다음과 같습니다.

    HARDIRQ_MASK: 11110000000000000000
    HARDIRQ_OFFSET: 00010000000000000000

    그런데 인터럽트 컨택스트 도중에 IPI(Inter Process Interrupt)가 발생할 수 있고 이 경우 preempt_count() 값은
    00110000000000000000 이 될 수 있습니다.

    따라서 다음과 같은 코드로 인터럽트 컨택스트를 식별하는 것으로 보입니다.
    #define irq_count()(preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK
    | NMI_MASK))

    #define in_interrupt()(irq_count())

    알려주신데로, HARDIRQ_OFFSET와 AND 연산을 하면 인터럽트 컨택스트를 제대로 식별할 수 있습니다만,
    코드 구현 내용을 따라 보니 HARDIRQ_MASK으로 언급한 것입니다.
  • Daniel 2018/12/14 14:25 #

    저는 변수명과 값이 매칭되지 않은 것을 확인차 문의드리건데
    자세한 답변 덕분에 또 하나 배워갑니다.
    감사합니다.
  • Guillermo 2018/12/14 14:27 #

    헉~~ 좋은 지적 감사합니다.
    HARDIRQ_MASK(0xf0000) 이렇게 해야 겠네요. ^^
  • harang90 2020/03/02 21:39 # 삭제 답글

    감사합니다. 도움 많이 되었습니다.
  • AustinKim 2020/03/03 07:22 #

    도움이 됐다니 뿌듯합니다. 자주 오셔서 유용한 정보 얻어 가세요.

    Thanks,
    Austin Kim
  • 사바14 2021/01/02 22:31 # 삭제 답글

    drivers/mmc/host/bcm2835-sdhost.c 파일을 수정하고 빌드 및 커널 설치를 했는데요.
    코드에 적용한 printk 함수를 이용하여 출력하는 메시지는 어떤 경우에 어디에서 확인할 수 있을까요?
  • AustinKim 2021/01/02 23:07 #

    라즈베리 파이에서 /var/log/kern.log에 커널 로그를 확인할 수 있습니다. 이 파일을 열면 printk로 추가하신 문자열을 확인할 수 있습니다.
  • 2021/01/02 23:07 # 답글 비공개

    비공개 덧글입니다.
댓글 입력 영역