프로세스마다 주소 공간 페이지 테이블이 다릅니다.
Linux 커널에는 자체 페이지 테이블이 있습니까? 그렇지 않은 경우 커널의 가상 주소는 어떻게 실제 메모리 주소로 변환됩니까?
각 프로세스의 주소 공간이 사용자 공간과 커널 공간으로 나누어진다는 의미에서 각 프로세스의 페이지 테이블에는 커널의 "페이지 테이블"이 포함되어 있습니까?
감사해요.
관련된페이지 폴트, 페이지 교체 및 페이징이 커널에서 발생합니까, 아니면 프로세스, 커널 공간 또는 사용자 공간에서만 발생합니까?
답변1
당신 말이 맞아요. 프로세스의 VM은 사용자 주소 공간과 커널 주소 공간으로 구성됩니다. 모든 프로세스의 커널 주소 공간은 동일하지만 액세스로부터 보호됩니다. 2/2 또는 3/1 메모리 분할(x32로 시작)에 대해 들어본 적이 있다면 이는 GB 단위의 사용자/커널 메모리 양입니다. 따라서 4GB 주소 공간을 사용하면 프로세스에 3G를 할당하고 커널에 1G를 할당할 수 있습니다.
이에 대한 답변과 기타 많은 질문에 답해 줄 "Linux 커널 이해"라는 책을 읽어 보시기 바랍니다.
답변2
"페이지 테이블"은 실제로 트리 구조입니다. 예를 들어"4단계 페이지 테이블"[LWN.net, 2004].
최상위 수준은 단일 페이지(4096바이트)입니다. 커널 범위를 매핑하는 항목은 모든 프로세스에서 동일한 값으로 설정되므로 공유됩니다. 커널 임시 매핑은 트리의 하위 수준에서 발생하므로 각 프로세스 페이지 테이블을 개별적으로 수정하는 대신 공유 커널 페이지 테이블 내부만 수정하면 됩니다.
적어도 그것은 나의 일반적인 개요입니다. 나는 모든 단어를 가지고 있지 않습니다.
위의 내용은 내 답변에서 교차 게시되었습니다.https://unix.stackexchange.com/a/513184/29483
답변3
저도 같은 문제가 있어서 제가 찾은 결과를 공유하고 싶습니다. 컴퓨터 아키텍처에 따라 다릅니다.
ARM 프로세서- 두 개의 서로 다른 테이블을 지원할 수 있습니다.
한마디로 2개다페이지 테이블 기본 레지스터또 다른 제어 레지스터는 주소 공간을 분할하는 데 사용됩니다. PTBR 중 하나는 커널에서 사용할 수 있고 다른 하나는 실행 중인 사용자 프로세스에서 사용할 수 있습니다. ARM은 다음 레지스터를 호출합니다. TTBR1/TTBR2(변환 테이블 기본 주소 레지스터) 및 TTBCR(변환 테이블 기본 주소 제어 레지스터)
x86 프로세서- (하드웨어) 지원이 제공되지 않습니다. x86 프로세서에는CR3현재 페이지 테이블 주소를 보유하는 레지스터입니다.
하지만, 커널 페이지 테이블의 중복은 실제로 페이지 테이블 디렉토리의 첫 번째 수준에 있는 각 프로세스에만 존재합니다. 가상 주소의 커널 부분(최상위 페이지 테이블)에 대한 모든 가상 페이지 테이블 항목은 다음을 가리킵니다.동일한레벨 2 페이지 테이블은 다른 프로세스에 대한 최상위 페이지 테이블 역할을 합니다.
의미: 오직반최상위 페이지 테이블(다음과 같이 설계됨)최대단일 페이지 프레임)은 실제로 중복됩니다.
이는 2018년에 발표된 Meltdown 보안 취약점과도 관련이 있습니다. 커널 페이지 테이블은 각 가상 주소 공간에 매핑되어 각 프로세스의 페이지 테이블에 나타나기 때문에 경쟁 조건을 통해 사용자 공간 코드는 해당 프로세스의 페이지 테이블에서 액세스 가능한 모든 메모리를 읽을 수 있습니다. 페이지 테이블(예: 커널 메모리) 해결책은 구현하는 것입니다.커널 페이지 테이블 격리:
KPTI는 사용자 공간과 커널 공간 페이지 테이블을 완전히 분리하여 이러한 누수 문제를 해결합니다. 페이지 테이블 세트에는 이전과 동일한 커널 공간 및 사용자 공간 주소가 포함되지만 시스템이 커널 모드에서 실행될 때만 사용됩니다. 사용자 모드에 사용되는 두 번째 페이지 테이블 세트에는 시스템 호출, 인터럽트 및 예외를 시작하거나 종료하는 데 필요한 정보를 제공하는 사용자 공간 복사본과 최소 커널 공간 맵 세트가 포함되어 있습니다.
답변4
이것은 흥미로운 질문이고 제가 궁금한 질문입니다. 나는 다음과 같은 조건 하에서 이 질문에 대답하려고 노력할 것입니다.
- 커널 버전 5.10.7
- 아치 x86
CONFIG_PGTABLE_LEVELS
2입니다(보조 페이지 테이블 사용).- 커널 주소 공간은 1G입니다.
각 프로세스에 대해 첫 번째 레벨 페이지 테이블을 "페이지 전역 디렉토리" 또는 pgd
. 인덱스 #768부터 인덱스 #1023까지의 항목 pgd
은 커널 주소를 매핑하는 데 사용됩니다. 각 프로세스에는 고유한 4K 바이트 페이지가 있습니다 pgd
. 예, 귀하의 질문에 대해 #768에서 #1023까지의 항목은 pgd
동일하며 각 프로세스에 대해 반복됩니다. 그러나 이는 극히 일부일 뿐입니다. 커널의 보조 페이지 테이블은 여전히 모든 프로세스에서 공유됩니다.
첫 번째 레벨 페이지 테이블(pgd)의 반복 부분이 어떻게 생성되는지 이해하려면 arch/x86/mm/pgtable.c
해당 기능 을 참조하십시오 .pgd_ctor()