2013-02-26 4 views
2

입출력을 차단하는 경우 (예 : 드라이버 읽기)에는 몇 가지 조건으로 wait_event_interruptible()을 호출합니다. 조건이 충족되면 읽기가 완료됩니다. wait_event_interruptible() 함수를 살펴본 후 조건을 확인하고 schedule()을 호출합니다. schedule()은 다음 실행 가능한 프로세스를 찾고 컨텍스트 스위치와 다른 프로세스가 실행됩니다. 즉,이 프로세스가 다시 깨어 나면 현재 프로세스에 대해 실행될 다음 명령은 내부 schedule() 함수가됩니다. schedule()이 언제 반환합니까?

  1. 여러 프로세스가 자발적으로 일정을 호출하는 경우 예, 모든 프로세스가 다음 명령을 경우

    는 잘 일정() 안의 될 것 깨우지됩니다 한 번 한 후에 실행되는?

  2. ret_from_interrupt의 경우 schedule()이 호출됩니다. 언제 돌아올까요? 그 후에는 iret가 실행됩니다.

답변

1

첫 번째 질문에 대한 대답은 yes 인 것으로 생각합니다. 이것은 컨텍스트 스위칭을 구현하는 일반적인 방법입니다. 예 : That's how OS161 works.

스케쥴러가 ISR에서 호출되면 모든 것이 동일해야합니다. 스케줄러는 컨텍스트를 변경하고 ISR로 돌아 가야하며 ISR은 IRET을 사용하여 리턴해야합니다. 스케줄러가 다른 프로세스로 전환하기로 결정하면 컨텍스트를로드하고 이전 프로세스를 저장하면 다른 프로세스/스레드로 돌아갑니다.

+0

응답 해 주셔서 감사합니다. 여기 _schedule() _이 인터럽트 컨텍스트로 돌아갈 수있는 방법을 이해할 수 없습니까? 어떤 프로세스로도 실행되지 않기 때문입니다. – Krishna

+0

인터럽트 컨텍스트 자체는별로 없으며 인터럽트가 발생하는 현재 프로세스의 스레드 컨텍스트의 일부입니다. ['그림 4-6. "Understanding the Linux Kernel, 3rd Edition"절의 "4.9. 인터럽트 및 예외에서 복귀"섹션의 "인터럽트 및 예외에서 복귀"(http://www.makelinux.net/books/ulk3/understandlk-CHP-4) -SECT-9). 관련 섹션을 읽으십시오. –

0

다시 점 2 : iret 명령어 (인터럽트 핸들러에서 반환)가 실행되고 ret_from_interrupt으로 연결됩니다. 그런 다음 Linux는 실행 (schedule()) 옆의 작업으로 제어권을 넘깁니다. 인터럽트 핸들러를 작성할 때 우선적으로 고려해야 할 사항 중 하나는 많은 다른 활동이 실행되는 동안 (다른 우선 순위가 낮고 우선 순위가 높은 인터럽트) 가능한 빨리 빠져 나가기를 원한다는 것입니다. 그래서 대부분의 인터럽트 처리기는 복귀하기 전에 수행 할 작업을 숨기고 작업은 다른 특수 커널 스레드에서 처리됩니다.

+0

응답 해 주셔서 감사합니다. 코드에서 _common_interrupt_ _do_IRQ_ 호출 후 _ret_from_intr_ 점프 참조하십시오. _ret_from_intr_에서 _resume_kernel_을 (를) 누르고 거기에서 _preempt_schedule_irq() _를 호출합니다. ** restore_all **을 누르거나 조만간 ** iret **가 실행됩니다. 내가 놓친 게 있니? – Krishna