2011. 10. 13. 20:26
softirq 레이즈 OS이야기2011. 10. 13. 20:26
핸들러를 enum 목록에 추가하고 open_softirq()를 통해 등록했다면 이제 실행할 준비가 되었따.
softirq를 지연되었다고 표시하여 다음 do_softirq() 호출 때 실행되게 하기 위하여 raise_softirq()를 호출한다. 예를 들어 네트워크 서브시스템은 다음과 같이 호출한다.
raise_softirq(NET_TX_SOFTIRQ)
이것은 NET_TX_SOFTIRQ란 softirq를 레이즈한다. 핸들러인 net_tx_action()은 커널이 softirq를 다음번에 수행할 때 실행한다.
이 함수는 softirq()를 레이즈하기 전에 인터럽트를 비활성화시키고 레이즈후 이전 상태로 복구한다. 만약 인터럽트가 이미 비활성화 상태라면 raise_softirq_irqoff() 함수를 사용하여 좀더 최적화할 수 있다.
/* 인터럽트는 반드시 비활성화 상태여야 한다 */
raise_softirq_irqoff(NET_TX_SOFTIRQ) //비활성화 상태임을 보장
/*************
일반적으로 softirq는 인터럽트 핸들러 안에서 레이즈된다. 인터럽트 핸들러(top half)는 기본적인 하드웨어 작업을 수행하고 softirq를 레이즈하며 종료됨. 인터럽트 처리를 종료하면서 커널은 do_softirq()를 호출한다. 그러면 softirq가 실행되어 지연된 인터럽트 핸들러를 찾게된다.
**********************/
softirq를 지연되었다고 표시하여 다음 do_softirq() 호출 때 실행되게 하기 위하여 raise_softirq()를 호출한다. 예를 들어 네트워크 서브시스템은 다음과 같이 호출한다.
raise_softirq(NET_TX_SOFTIRQ)
이것은 NET_TX_SOFTIRQ란 softirq를 레이즈한다. 핸들러인 net_tx_action()은 커널이 softirq를 다음번에 수행할 때 실행한다.
이 함수는 softirq()를 레이즈하기 전에 인터럽트를 비활성화시키고 레이즈후 이전 상태로 복구한다. 만약 인터럽트가 이미 비활성화 상태라면 raise_softirq_irqoff() 함수를 사용하여 좀더 최적화할 수 있다.
/* 인터럽트는 반드시 비활성화 상태여야 한다 */
raise_softirq_irqoff(NET_TX_SOFTIRQ) //비활성화 상태임을 보장
/*************
일반적으로 softirq는 인터럽트 핸들러 안에서 레이즈된다. 인터럽트 핸들러(top half)는 기본적인 하드웨어 작업을 수행하고 softirq를 레이즈하며 종료됨. 인터럽트 처리를 종료하면서 커널은 do_softirq()를 호출한다. 그러면 softirq가 실행되어 지연된 인터럽트 핸들러를 찾게된다.
**********************/
'OS이야기' 카테고리의 다른 글
태스크릿의 스케줄링 (0) | 2011.10.14 |
---|---|
태스크릿 (0) | 2011.10.14 |
softirq 새 핸들러 등록 (0) | 2011.10.13 |
softirq 사용 (0) | 2011.10.13 |
softirq 구현, 핸들러, 실행 (0) | 2011.10.13 |