2013-03-05 2 views
0

이전에 등록한 다른 프로세스를 예약하기 위해 인터럽트 처리기에서 컨텍스트 전환을 수행 할 수 있습니까? 그렇다면 어떻게해야합니까?인터럽트 처리기에서 컨텍스트 전환을 만드는 방법은 무엇입니까?

+0

구체적으로 사용자 모드 프로세스에 사용자 모드 irq 처리기를 등록했습니다. 따라서 인터럽트가 발생하면 즉시 사용자 모드 처리기로 건너 뛰고 싶습니다. do_IRQ의 현재 프로세스가 이전에 등록한 프로세스가 아닌 경우 등록 된 프로세스를 실행하기 위해 컨텍스트 스위치를 만들고 싶습니다. – goodjesse

답변

1

정확하게 질문을 이해할 수 있는지 확실하지 않지만 지연 작업을 언급하고 있습니까?

이 당신이 사용자 프로세스를 예약 할 경우, 하나의 방법은 펜던에 (커널 내부) 세마포어의 사용자 스레드 것

등 태스크 릿을 사용하여 ISR의에서 작업을 연기 할 수있는 방법을 설립 찌를된다 ISR의 세마포어

+0

사용자 모드 프로세스에 사용자 모드 irq 핸들러를 등록했습니다. 따라서 인터럽트가 발생하면 직접 핸들러로 이동할 수 있습니다. 나는 현재 프로세스를 내가 등록한 프로세스로 만들고 싶다. – goodjesse

0

먼저 Ok, 인터럽트 섹션 즉, 상반부에서 컨텍스트를 전환 할 수 없습니다.

그러나 인터럽트 컨텍스트 또는 프로세스 컨텍스트에서 실행되도록 다른 기능을 예약 할 수 있습니다. 이것을 달성하는 방법은 인터럽트 처리기의 하반부입니다.

1 : 등록 된 함수가 인터럽트 컨텍스트에서 실행되도록 예약하려면 Tasklet을 사용하십시오.

DECLARE_TASKLET (my_tasklet, functionname, 0);

irqreturn_t my_tl_interrupt(int irq, void *dev_id, struct pt_regs *regs) 
{ 
    tasklet_schedule(&my_tasklet); 
    return IRQ_HANDLED; 
} 

2 : 프로세스 컨텍스트에서 실행되도록 등록 된 기능을 예약하려면 작업 대기열을 사용하십시오.

INIT_WORK (& my_wq, (void *) (void *)) functionname, NULL);

irqreturn_t my_tl_interrupt(int irq, void *dev_id, struct pt_regs *regs) 
{ 
    schedule_work(&short_wq); 
    return IRQ_HANDLED; 
} 
0

아니요 당신은 인터럽트 컨텍스트에서 컨텍스트 전환을 할 수 없습니다. 인터럽트 컨텍스트에서 실행중인 작업은 스케줄러가 비활성화되어 있기 때문에 선점 할 수 없습니다.

하반부의 경우 softirq 및 tasklet이 모두 인터럽트 컨텍스트에서 실행되므로 절전 호출과 같은 컨텍스트 전환이 허용되지 않습니다. 그러나 작업 대기열 하단 절반 컨텍스트 전환이 가능합니다. 프로세스 컨텍스트 ksoftirqd에서 실행되기 때문에이 가능합니다.

관련 문제