리눅스 커널의 구조와 원리/6. 인터럽트 후반부 처리 (7) 썸네일형 리스트형 [리눅스커널] 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() 함수를 호출하는 것처럼 표.. [리눅스커널] 인터럽트 후반부 처리 기법 종류 및 소개 리눅스 커널이 Bottom Half을 처리하는 대표적인 기법으로 IRQ 스레드와 Soft IRQ이 있습니다. 워크큐는 워크큐를 다루는 포스트에서 살펴볼 예정입니다. 세 가지 기법 인터럽트 후반부 처리하는 방식이 조금씩 다릅니다. 하지만 인터럽트 핸들러에서 해야 할 일을 2 단계로 나눈다는 점은 같습니다. 이 세 가지 기법의 특징이 뭔지 알아보겠습니다. IRQ 스레드 인터럽트를 처리하는 전용 IRQ 스레드에서 인터럽트 후속 처리를 합니다. 만약 rasp란 24번 인터럽트가 있으면 “irq/24-rasp”란 IRQ 스레드가 24번 인터럽트 후반부를 전담해서 처리합니다. Soft IRQ 인터럽트 핸들러 실행이 끝나면 바로 일을 시작합니다. 인터럽트 핸들러 바로 처리해야 할 일을 마무리한 후 인터럽트.. [리눅스커널] 인터럽트 후반부 - Top Half/Bottom Half 란 무엇일까? 이전 포스트에서 인터럽트 컨택스트에서 인터럽트 핸들링을 빠른 시간에 마무리해야 한다고 설명을 드렸습니다. 또한 시간이 오래 걸리는 함수를 호출하면 시스템은 커널 패닉과 같이 시스템이 오동작 할 수 있다고 소개했습니다. 여기서 한 가지 의문이 생깁니다.인터럽트가 발생하면 인터럽트 핸들러에서 처리할 일이 많을 때는 어떻게 해야 할까? 이럴 때 해야 할 일을 2가지로 나누면 됩니다. 빨리 처리해야 하는 일과 조금 있다가 처리해도 되는 일입니다. 임베디드 용어로,인터럽트가 발생 후 빨리 처리해야 하는 일은 Top Half조금 있다가 처리해도 되는 일은 Bottom Half라고 말합니다. 인터럽트 핸들러가 하는 일은 Top Half라고 할 수 있습니다. Bottom Half는 인터럽트에 대한 처리를 프로세.. [리눅스커널] 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 방식이라고도 합니다. .. [리눅스커널] 인터럽트 후반부 기법은 왜 적용할까? 인터럽트 후반부 기법을 적용하는 이유 인터러트 후반부 기법을 쓰는 이유에 대해 알아보기 전에 커널이 인터럽트를 어떤 방식으로 처리하는지 살펴볼 필요가 있습니다. 5장에서 배운 내용을 정리해보겠습니다. 1. 인터럽트가 발생하면 커널은 실행 중인 프로세스를 멈추고 인터럽트 벡터를 실행해서 인터럽트 핸들러를 실행합니다. 2. 인터럽트 핸들러는 짧고 빨리 실행해야 합니다. 3. 인터럽트를 처리하는 구간이 인터럽트 컨택스트인데 이를 in_interrupt() 함수가 알려줍니다. 인터럽트 후반부 기법을 적용해야 하는 이유는 인터럽트 컨택스트에서 빨리 실행을 끝내야 하기 때문입니다. 인터럽트는 실행 중인 코드를 멈추고 인터럽트를 핸들링하기 때문입니다. 자연스럽게 임베디드 리눅스 개발자뿐만 아니라 임베디드 .. 이전 1 다음