INTERRUPT

포스트: 25
Tags

Posts

25 posts

[리눅스커널] 인터럽트 컨택스트에서 많은 일을 하면 어떻게 될까?

Guillermo Austin Kim|2019년 2월 10일

인터럽트 컨택스트에서 많은 일을 하면 어떻게 될까? 인터럽트 후반부 처리 기법을 왜 적용해야 하는지 설명드리기 위해 인터럽트 컨택스트에서 많은 일을 하는 코드를 적용하면 시스템이 어떻게 오작동하는지 소개합니다. 디바이스 드라이버를 개발하다 보면 인터럽트 컨택스트에서 인터럽트 핸들링을 할 때 많은 일을 하는 코드를 입력할 때가 있습니다. 대표적으로 다음과 같은 예를 들 수 있습니다. - I/O을 시작하는 코드 - 과도한 while loop - 유저 공간으로uevent를 전달해서 인터럽트 발생을 알림 - 스케줄링을 지원하는 커널 함수 호출 위와 같은 코드를 입력하면 시스템 반응 속도가 아주 느려지거나 평소에 볼 수 없는 오류 메시지를 볼 수 있습니다. 인터럽트 핸들러와 서브 루틴에서 코드

[리눅스커널] 인터럽트 후반부 기법을 적용하는 이유

Guillermo Austin Kim|2019년 2월 10일

인터럽트 후반부 기법을 적용하는 이유 인터러트 후반부 기법을 쓰는 이유에 대해 알아보기 전에 커널이 인터럽트를 어떤 방식으로 처리하는지 살펴볼 필요가 있습니다. 5장에서 배운 내용을 정리해보겠습니다. 1. 인터럽트가 발생하면 커널은 실행 중인 프로세스를 멈추고 인터럽트 벡터를 실행해서 인터럽트 핸들러를 실행합니다. 2. 인터럽트 핸들러는 짧고 빨리 실행해야 합니다. 3. 인터럽트를 처리하는 구간이 인터럽트 컨택스트인데 이를 in_interrupt() 함수가 알려줍니다. 인터럽트 후반부 기법을 적용해야 하는 이유는 인터럽트 컨택스트에서 빨리 실행을 끝내야 하기 때문입니다. 인터럽트는 실행 중인 코드를 멈추고 인터럽트를 핸들링하기 때문입니다. 자연스럽게 임베디드 리눅스 개발자뿐만 아니라 임베디드

5.4.3 인터럽트 핸들러 등록 시 플래그 설정

Guillermo Austin Kim|2019년 2월 6일

5.4.3 인터럽트 핸들러 등록 시 플래그 설정이 내용을 다루기 전에 인터럽트 신호에 대해서 조금 살펴보겠습니다. 가끔 인터럽트가 제대로 안 올라온다거나 디바이스 드라이버를 처음 올려서 기본 동작을 확인할 때 오실로스코프 장비로 인터럽트 파형을 측정합니다. 이럴 때 가끔 하드웨어 개발자와 분쟁이 생기는데요. 인터럽트을 발생시키는 하드웨어에 노이즈가 껴서 제대로 인터럽트 신호를 제대로 전달을 못 하면 드라이버에서 인터럽트를 제대로 처리하지 않는 것처럼 보일 때가 있거든요. 가끔은 인터럽트 신호가 엄청나게 자주 발생해서 시스템 오동작을 유발할 때도 있습니다. 이를 리눅스 커널 커뮤니티에서 IRQ Storm이라고 합니다. 이렇게 인터럽트 동작에 조금이라도 의문이 생기면 인터럽트 파형을 측정하셔서 고생 덜하시길

[라즈베리파이] Soft IRQ 서비스는 누가 언제 처리하나? [2] - __do_softirq() 분석

[라즈베리파이] Soft IRQ 서비스는 누가 언제 처리하나? [2] - __do_softirq() 분석

Guillermo Austin Kim|2018년 7월 15일

이제 Soft IRQ 의 핵심 코드인 __do_softirq 함수를 분석할 차례입니다. 전체 코드는 다음과 같습니다.1 asmlinkage __visible void __softirq_entry __do_softirq(void)2{3unsigned long end = jiffies + MAX_SOFTIRQ_TIME;4unsigned long old_flags = current->flags;5int max_restart = MAX_SOFTIRQ_RESTART;6struct softirq_action *h;7bool in_hardirq;8__u32 pending;9int softirq_bit;10//...1112pending = local_softirq_pending();13account_