본문 바로가기

threaded IRQ

(5)
[리눅스커널] IRQ 스레드를 생성하는 시점 확인하기 이번 포스트에서는 IRQ 스레드를 생성하는 과정을 알아 봅시다.IRQ 스레드는 언제 생성할까?IRQ 스레드를 생성하기 위해서는 request_threaded_irq() 함수를 호출하면 됩니다.  IRQ 스레드를 생성하는 흐름도는 다음과 같습니다.   request_threaded_irq() 함수를 호출하면 다음 동작을 수행합니다.  - 전달한 IRQ 스레드 정보를 인터럽트 컨택스트에 설정  - kthread_create() 함수를 호출해서 IRQ 스레드 생성 kthread_create() 함수는 kthread_create_on_node() 함수로 치환됩니다. 위 그림에서 이해를 돕기 위해 kthread_create() 함수를 호출하면 kthread_create_on_node() 함수를 호출하는 것처럼 표..
[리눅스커널] 부모 프로세스가 자식 프로세스를 생성하는 과정 ftrace 로그로 분석해보기 부모 자식 프로세스 생성 실습 및 ftrace 로그 분석 이번에 리눅스 시스템 프로그래밍으로 프로세스를 생성해 봅시다. 소스 코드는 다음과 같으니 같이 입력해 봅시다.1 #include 2 #include 3 #include 45 #define PROC_TIMES 76 #define SLEEP_DURATION 27 #define FORK_MAX_TIMES 389 void raspbian_proc_process(void);1011 void raspbian_proc_process(void) 12 {13 int proc_times = 0;14 15 for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) {16 printf("raspbian tracing ppi..
[리눅스커널] IRQ 스레드 생성 과정을 디버깅으로 알아보기 라즈베리파이에서 IRQ 스레드 생성 과정 디버깅하기 이번 절에선 request_threaded_irq() 함수를 호출하면 결국 kthread_create() 함수를 실행해서 IRQ 스레드를 생성하는 과정까지 짚어 봤습니다. 이제 디버깅 과정을 통해 배운 내용을 다지는 시간을 갖겠습니다. 먼저 디버깅을 위한 패치 코드를 소개합니다. +기호로 볼드체로 된 부분이 추가할 코드입니다.패치 코드를 입력할 함수는 __kthread_create_on_node() 입니다. 이전 절에서 분석하지 않은 __kthread_create_on_node() 함수에 IRQ 스레드를 생성하는 코드를 작성한 이유는 무엇일까요? 그 이유을 알게 위해서 다음 setup_irq_thread() 함수 코드를 살펴볼 필요가 있습니다.1 sta..
[리눅스커널] IRQ 스레드를 생성하는 샘플 코드 살펴보기 IRQ 스레드 생성 예제 코드 분석 이번에는 IRQ 스레드를 생성하는 예제 코드를 소개합니다. 실제 request_threaded_irq() 함수를 호출해서 IRQ 스레드를 생성하는 과정을 살펴보겠습니다. 분석할 코드는 다음과 같습니다.[https://elixir.bootlin.com/linux/v4.14.30/source/drivers/usb/dwc3/gadget.c]1 static int dwc3_gadget_start(struct usb_gadget *g,2 struct usb_gadget_driver *driver)3 {4 struct dwc3 *dwc = gadget_to_dwc(g);5 unsigned long flags;6 int ret = 0;7 int irq;89 irq = dwc->ir..
[리눅스커널] IRQ 스레드(threaded IRQ)에 대한 소개 IRQ 스레드란리눅스 커널을 익히는 과정에서 만나는 걸림돌 중 하나가 어려운 용어입니다. 어려운 개념을 낯선 용어로 설명하니 이해하기 어렵죠. IRQ Thread의 의미를 알기 전에 IRQ란 용어부터 알아볼까요? IRQ는 Interrupt Request의 약자로 하드웨어에서 발생한 인터럽트를 처리 한다는 의미입니다. 조금 더 구체적으로 인터럽트 발생 후 인터럽트 핸들러까지 처리하는 흐름입니다.  IRQ Thread란 뭘까요? 인터럽트 핸들러에서는 처리하면 오래 걸리는 일을 수행하는 프로세스입니다. 인터럽트 후반부 처리를 위한 인터럽트 처리 전용 프로세스입니다. 리눅스 커널에서는 IRQ Thread를 irq_thread라고도 합니다. 리눅스 커널 커뮤니티에서는 threaded IRQ 방식이라고도 합니다. ..