커널 페이지 테이블은 모든 프로세스에서 어떻게 공유됩니까?

커널 페이지 테이블은 모든 프로세스에서 어떻게 공유됩니까?

예를 들어 x86에서 커널이 각 프로세스 주소 공간에 어떻게 매핑되는지 더 잘 이해하여 커널 주소가 매핑되는 내용을 변경하면 모든 프로세스와 모든 코어에서 변경될 수 있도록 노력하고 있습니다. 구체적인 예를 들기 위해 프로세스 A의 시스템 호출 중에 커널 주소 0xC0000004가 페이지 프레임 1000에 매핑된다고 가정합니다.

내 질문은: 여러 코어에서 동시에 실행될 수 있는 프로세스 B와 C뿐만 아니라 현재 실행되고 있지 않은 프로세스에 대해 이러한 매핑을 어떻게 업데이트합니까?

모든 프로세스가 커널 페이지 테이블의 중앙 세트만 "지정"/참조할 수 있는 방법이 있어야 한다고 가정합니다. 따라서 해당 중앙 위치에 대한 업데이트는 모든 프로세스에 대한 변경을 의미합니다. 그러나 각 코어에 자체 MMU가 있는 경우 멀티 코어 시스템은 이를 어떻게 처리합니까? 예제가 포함된 연습은 매우 도움이 될 수 있습니다. 감사해요.

답변1

페이지 테이블 계층 구조가 답입니다. Linux 페이지 테이블은 여러 수준으로 나누어져 있습니다. 이는 유효한 페이지 테이블을 찾기 위해 페이지 테이블을 드릴다운할 때 pte종종 공간 최적화로 간주됩니다(전체 프로세스 주소 공간이 아닌 페이지 테이블만 유효한 메모리 위치를 저장함). . 그러나 커널의 경우 이는 기존 커널 페이지 테이블 매핑을 프로세스 간에 재사용할 수 있다는 의미이므로 성능 최적화이기도 합니다.

커널 맵 업데이트는 처음 생각하는 것만큼 중요하지 않습니다. 일반적으로 커널 주소 공간 변경 예제는 각 프로세스에 대해 PGD(페이지 전역 디렉터리) 아래 수준(가장 높은 페이지 테이블 수준)에서 발생하기 때문입니다. 커널 페이지 테이블 격리에 대한 설명에서 알 수 있듯이(KPTI), 프로세스의 페이지 전역 디렉터리에서 커널 매핑을 제거할 수 있는 경우 프로세스는 어떤 커널 코드에도 액세스할 수 없어야 합니다. 이는 모든 프로세스 PGD가 동일한 하위 수준 커널 페이지 테이블을 가리킨다는 의미입니다. 코어가 하나만 있다고 가정하면 이러한 하위 페이지 테이블의 모든 커널 메모리 업데이트는 메모리의 단일 업데이트로 모든 프로세스에 표시됩니다. 물론 이 업데이트는 모든 CPU에 전파되어야 하지만 이는 일반적인 캐시 일관성 업데이트일 뿐입니다. 컴퓨터에서 실행 중인 모든 프로세스에 대한 매핑을 수동으로 업데이트하는 것보다 훨씬 덜 집중적입니다.

관련 정보