context_switch()는 언제 제어를 새로운 프로세스로 전환합니까?

context_switch()는 언제 제어를 새로운 프로세스로 전환합니까?

컨텍스트 전환을 올바르게 이해했다면 프로세스에는 두 가지 주요 단계가 포함됩니다.

  1. MMU는 새로운 프로세스의 가상 메모리 공간을 물리적 메모리 공간으로 매핑하도록 전환됩니다.
  2. 현재 프로세스의 프로세서 상태를 저장한 다음 새 프로세스의 저장된 프로세서 상태로 전환합니다. 아마도 여기에는 프로세스가 마지막으로 중지된 위치에서 실행을 시작하도록 프로그램 카운터를 설정하는 것이 포함됩니다.

커널에서는 이 모든 것을 처리하는 함수를 context_switch()(소스코드는 여기에). 이 함수는 두 가지 필수 단계를 처리하지만 프로세서 상태를 설정한 후 반환됩니다.

context_switch()프로그램 카운터가 수동으로 새 위치로 이동되면 다시 돌아갈 기회가 전혀 없는 것처럼 보이기 때문에 이것은 혼란스럽습니다 . 제가 생각할 수 있는 유일한 설명은 이것이 context_switch()모두 새로운 프로세스로 전환하기 위한 코드라는 것입니다.그리고전환 프로세스에서 반환된 코드입니다. 즉, 각 프로세스는 결국 자체 프로세스에서 context_switch()다른 프로세스로 전환됩니다 context_switch(). 그러나 이것이 새로 분기된 프로세스에 어떻게 작용하는지 알 수 없는 것 같습니다. 그렇다면 context_switch()실행이 실제로 완료되어 반환된 다음 다른 것이 대상 프로세스의 올바른 부분으로 점프할 수 있을까요?

이 생각이 맞나요? 정확히 언제 context_switch()한 프로세스에서 다른 프로세스로 이동합니까? 때 context_switch()돌아오고있다? 새 프로세스로 전환하면 새 프로세스의 실행 상태는 어디에서 끝나나요? 이것이 새로 분기된 프로세스에 어떻게 적합합니까?

나는 이것을 알아내려고 지난 며칠 동안 커널 소스 코드의 관련 부분을 읽었지만 이해하는 데 더 가까워지지 않는 것 같습니다. 여기 누군가가 도움을 줄 수 있기를 바랍니다.

답변1

해당 줄의 주석을 참고하세요.3366(5.7.7부터):

/* Here we just switch the register state and the stack. */

context_switch()새로운 명령 포인터(프로그램 카운터)를 직접 로드하는 대신 스택을 전환하고 스택에는 적절한 반환 주소가 포함됩니다. 함수가 반환되면 새 작업으로 반환됩니다.

분기할 때 가상 반환 주소는 두 프로세스(상위 및 하위)에서와 동일합니다. 차이점은 반환 값입니다.

관련 정보