Linux의 가상 메모리 시스템이 다음 상황을 처리하는 방법:
- 프로세스 1은 가상 페이지 중 하나를 물리적 프레임 1에 매핑합니다.
- 프로세스 2로 컨텍스트 전환.
- 프로세스 2는 프레임 1을 교체하고 이를 자체 내용으로 대체합니다.
- 컨텍스트를 다시 프로세스 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