Linux에서 컨텍스트 전환 후 페이지 테이블을 업데이트하는 방법

Linux에서 컨텍스트 전환 후 페이지 테이블을 업데이트하는 방법

Linux의 가상 메모리 시스템이 다음 상황을 처리하는 방법:

  1. 프로세스 1은 가상 페이지 중 하나를 물리적 프레임 1에 매핑합니다.
  2. 프로세스 2로 컨텍스트 전환.
  3. 프로세스 2는 프레임 1을 교체하고 이를 자체 내용으로 대체합니다.
  4. 컨텍스트를 다시 프로세스 1로 전환합니다.

프로세스 1은 프레임 1의 내용을 소유하지 않고 교체해야 한다는 것을 어떻게 알 수 있습니까?

답변1

기술적으로 "process1"은 이를 모릅니다. 각 프로세스에는 일련의 페이지 테이블이 있습니다. 커널은 어떤 프로세스로 전환할지 알고 페이지 테이블을 전환합니다. 이러한 페이지 테이블의 일부는 커널이며 모든 프로세스 간에 공유됩니다(따라서 주소 범위의 일부는 일반적으로 0xc0000000 ~ 0xffffffff 범위에 있음 - 이러한 페이지가 모두 존재하지는 않지만). 일반적으로 이 공유 부분은 모든 페이지 테이블 세트가 "커널 페이지 테이블 비트"의 동일한 공유 부분을 가리키도록 함으로써 구현됩니다.

이 공유 섹션을 사용하면 현재 실행 중인 프로세스나 해당 프로세스가 수행 중인 작업에 관계없이 커널 호출, 트랩 및 인터럽트가 커널에 들어갈 수 있습니다.

이것이 작동하는 정확한 방법은 커널이 구축된 아키텍처에 따라 다르지만 예를 들어 x86(32 및 64비트)에서 CR3은 현재 페이지 테이블을 가리키는 레지스터입니다. 따라서 각 프로세스마다 페이지 테이블에 대한 포인터가 있으며 새 프로세스로 전환하는 과정의 일부로 CR3에 로드됩니다. 마치 프로세스 1에 대해 레지스터 값(적어도 스택 포인터)이 복원되는 것과 같습니다. 켜져 있습니다.

답변2

문제는 가상 메모리 주소 공간이 아니라 두 프로세스 간 컨텍스트 전환 시 페이지 프레임 충돌에 관한 것입니다(가상 메모리 주소 공간은 각 프로세스마다 고유하며 이는 뉴스가 아닙니다.). 이 스택 오버플로 링크에는 똑같은 질문과 정확한 답변이 있습니다. https://stackoverflow.com/questions/16581490/how-does-kernel-know-which-pages-in-the-virtual-address-space-correspond-to-as?lq=1

관련 정보