인터럽트후반부

Category
아이템: 인터럽트후반부(7)
포스트 갯수7

[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드의 전체 실행 흐름 정리

By Guillermo Austin Kim | 2020년 4월 25일 | 
[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드의 전체 실행 흐름 정리
지금까지 IRQ 스레드 핸들인 irq_thread() 함수에서 irq_thread_fn() 함수를 호출해 IRQ 스레드 핸들러 함수를 호출하는 과정을 살펴봤습니다. 이번에는 배운 내용을 정리하는 차원으로 IRQ 스레드 전체 실행 흐름을 보면서 정리하는 시간을 갖겠습니다. [그림 6.7] "irq/86-mmc1" IRQ 스레드 실행 흐름도 눈끔 화살표는 함수 실행 흐름 방향입니다. 위 그림에서 실행 순서별 동작을 살펴보겠습니다. [1]: arch_cpu_idle() 함수 실행 중 86번 인터럽트가 발생해서 인터럽트 벡터인 __irq_svc가 실행합니다. [2]: __handle_irq_event_percpu() 함수까지 실행한 후 86번 인터럽트 핸들러인 bcm283

[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드 핸들러인 irq_thread() 함수 분석

By Guillermo Austin Kim | 2020년 4월 25일 | 
[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드 핸들러인 irq_thread() 함수 분석
커널에서 지원하는 wake_up_process() 함수를 사용해 커널 스레드를 깨우면 스케줄러에 의해 커널 스레드는 실행을 시작합니다. 이 때 커널 스레드의 스레드 핸들 함수가 호출되며 스레드의 시나리오에 따라 정해진 동작을 수행합니다. 마찬가지로 IRQ 스레드의 스레드 핸들 함수는 irq_thread() 입니다. 따라서 IRQ 스레드가 깨어나면 irq_thread() 함수가 호출됩니다. 이번 시간에는 IRQ 스레드를 깨우면 실행하는 irq_thread() 함수를 살펴보겠습니다. 먼저 IRQ 스레드를 깨우면 실행하는 irq_thread() 함수를 보겠습니다. static int irq_thread(void *data)2 {3struct callback_head on_exit_work;4stru

[리눅스커널][태스크릿] 태스크릿(struct tasklet_struct) 이란 무엇인가

By Guillermo Austin Kim | 2019년 4월 10일 | 
[리눅스커널][태스크릿] 태스크릿(struct tasklet_struct) 이란 무엇인가
태스크릿은 프로세스와 전혀 상관 없는 용어입니다. 태스크릿이란 이름 때문에 많은 분이 프로세스와 관련됐다고 오해할 수 있습니다. 태스크릿은 Soft IRQ 서비스 중 하나로 동적으로 Soft IRQ 서비스를 쓸 수 있는 인터페이스입니다. 드라이버 레벨에서 태스크릿은 자주 쓰고 활용합니다. 태스크릿은 무엇일까? 우리는 인터럽트 후반부 기법으로 Soft IRQ에 대해 다음과 같은 내용을 배웠습니다. 인터럽트 핸들링 후 바로 Soft IRQ 서비스 실행 인터럽트 발생 후 바로 후반부를 처리할 때 용이 다른 인터럽트 후반부 기법에 비해 Soft IRQ는 인터럽트 후반부를 빨리 처리해야 할 때 적용합니다. 그러면 이런 장점이 있는 Soft IRQ 서비스를 드라이버 레벨에서 쓰면 좋을 때가 있습니다

[리눅스커널][인터럽트후반부] IRQ 스레드 핸들러 실행 시각 측정하기

By Guillermo Austin Kim | 2019년 2월 28일 | 
IRQ 스레드 핸들러 실행 시각 측정하기 이전 절에서는 ftrace 로 콜스택과 함께 인터럽트가 언제 발생하고 언제 IRQ Thread를 깨우는지 알아봤습니다. 이번에는 실제 인터럽트 핸들러와 IRQ Thread 핸들러 함수 실행 시간을 측정하는 방법을 소개합니다. 각 함수의 실행 시간을 측정하고 실행 시간이 오래 걸리면 인터럽트 핸들러 함수 코드를 점검할 필요가 있습니다. 나중에 여러분이 인터럽트 핸들러를 작성한 후 이 방법을 써서 실행 시간을 측정해 보시길 바랍니다. ftrace에서 지원하는 function_graph 트레이서를 쓸려면 다음 config가 설정돼 있어야 합니다.CONFIG_DYNAMIC_FTRACE=yCONFIG_DYNAMIC_FTRACE_WITH_REGS=yCONFIG_FUNCTI