(1) 인터럽트(Interrupt)와 예외(Exception)

○ 인터럽트 : 어떤일을 수행하는 도중에 끼어드는 사건(Event)
  - 인터럽트가 발생했을때 일을 처리하는 것을 '인터럽트처리'라고 한다.
  - CPU가 프로세스 명령어를 순차적으로 수행하는 도중 다른 처리를 위해 끼어드는 사건(인터럽트) 발생시 CPU는 현재
    하던일을 멈추고, 사건을 처리하기위해 정의된 ISQ(Interrupt Service Routine)의 내용을 먼저 수행한다.


(2) 인터럽트에 대한 이해

○ 일반적으로 인터럽트 = 하드웨어 인터럽트
  - H/W는 비동기적으로 사건을 알리는데, H/W 인터럽트가 그 수단이다.
  - 이때 이 사건을 알리는 동작을 IRQ(Interrupt Request)라 한다. => 이 신호로 장비를 확인한다.
  - IRQ는 PIC(Programmable Interrupt Controller)를 통해서 요청한다.

○ 왜 인터럽트를 사용하느냐!
  - 인터럽트를 사용함으로써 CPU이용률을 높인다.

○ H/W뿐만아니라 현재 수행중인 프로세서에서도 인터럽트를 발생시킬수 있다.
  - 이 인터럽트를 S/W인터럽트 또는 trap이라 한다.    ex) system call

○ PIC -> Programmable Interrupt Controller
  - 하나의 CPU는 하나의 인터럽트만 확인가능 한데, 하나의 CPU에 여러개의 인터럽트가 연결되도록 해주는 칩셋이 바로
    PIC이다!


(3) 미룰 수 있는 인터럽트 '미룰 수 있는 인터럽트는 나중에 실행하자!'

○ Soft IRQ, tasklet, bottom-half 가 있다.
  - 커널 2.4에서 soft IRQ와 tasklet이 도입
  - 커넉 2.6에서 bottom-half 사용 중단.

○ softirq
  - 같은 종류(type)의 softirq들이 여러 cpu에서 동시에 실행될 수 있다.
  - 컴파일시 정적으로 할당된다.
  - But! 동기화 문제 해결해야하고, 재진입 가능한 코드로 만들어야 한다.
  - 이렇게 깐깐하니까 대부분 tasklet을 사용해서 구현한다.
     (몇몇 같은 type을 여러 cpu에서 동시에 사용해야 할때 softirq를 쓴다)

○ tasklet
  - 동적으로 할당
  - 같은종류의 tasklet은 여러 cpu에서 동시에 실행할 수 없다.
  - 동기화를 신경쓰지 않아서 구현이 매우 용이하다.
  - 대부분 I/O 디바이스에서 softirq보다  tasklet을 사용한다.


(4) IDT(Iterrupt Descriptor Table) 테이블

○ 리눅스는 인터럽트 처리를 위해 IDT를 사용한다.
  - 각 인터럽트를 처리하기위한 서비스 루틴을 함수로 구현해두고, 각 함수의 시작점 주소(핸들러함수)를 IDT에 등록
    [트랩과 시스템콜도 들어있다].

○ IDT는 메모리에 위치, 이를 가리키는 레지스터를 IDTR 이라 한다.

○ 
인터럽트발생 >> IDTR을 통해 IDT를 알아냄 >> 인터럽트 번호에 대응되는 테이블 엔트리에서 핸들러를 찾아서 이 루틴에
    정의된 내용을 처리한다.

○ IDT는 총 256개의 엔트리를 가진다. (각 엔트리는 8Byte크기의 디스크립터로 구성됨) 256 * 8 = 2048Btye 필요



(5) 커널 내부의 인터럽트 수행과정

- 인터럽트 발생
- 실행중인 프로세스 중지
- 커널모드 전환
- do_IRQ 함수 호출
- PIC에게 응답신호 보냄
- 실제 핸들러 함수를 호출
- 뒤로 미워진 softirq가 있으면 do_softing()tngod
- ....
- do_IRQ()함수가 종료되면 ret_from_intr 주소로 복귀
- 다시 사용자 모드로 전환


do_IRQ함수 : 인터럽트에 연관된 모든 인터럽트 서비스루틴을 실행하기위해 호출하는 함수

PIC : 인터럽트도중 같은 종류의 인터럽트 발생을 막음

 PIC에게 응답신호 보낸후 실제 핸들러 함수를 호출하는 세부 과정
  - 응답신호를 보낸다.
  - hancle_IRQ_event()함수가 호출된다.
  - action
  - handler(irq,action->dev_id,regs) 호출 중에 실제 핸들러 함수를 호출한다.


※ 출처 : http://idkkangjs.blog.me/30091117058

'L inux > Kernel' 카테고리의 다른 글

프로세스 - 프로세스와 프로세스 디스크립터  (0) 2011.09.26
모듈(Module)  (0) 2011.09.26
시스템 콜(System Call) - 2  (1) 2011.09.26
시스템 콜(System Call) - 1  (0) 2011.09.26
리눅스 커널 컴파일  (0) 2011.09.26
by 민트앤라떼 2011. 9. 26. 11:33