Linux 커널 문서에서는 다음을 설명합니다.가상 메모리 매핑.
그것은 말한다:
fffffe0000000000 - fffffe7fffffffff (=39 bits) cpu_entry_area mapping
이 "CPU 진입 영역"은 무엇입니까? 실행 중인 코드에 액세스할 수 있는 방법이 있나요?링 3(예: CPL3)?
QEMU를 실험하고 있는데 QEMU 게스트(Ubuntu Server 18.04)에서 실행되는 일부 CPL3 코드 가 cpu_entry_area
. CPL3 위의
모든 주소에 접근할 수 없다고 생각했기 때문에 뭔가 잘못된 일을 하고 있었지만 0x00007fffffffffff
나중에 알게 되었습니다 vsyscall
(참조여기).
vsyscall
QEMU 게스트 (구체적으로 ) 의 CPL3 코드에서 메모리에 액세스하려고 하는데 *(int *)0xffffffffff600000
성공하지만 cpu_entry_area
(구체적으로 ) 액세스하려고 하면 *(int *)0xfffffe0000000ee0
segfault가 발생합니다 .
답변1
cpu_entry_area
CPU가 제어권을 커널로 전송하는 데 필요한 모든 데이터와 코드가 포함되어 있습니다. KPTI가 활성화되면 사용자 공간이 실행될 때 커널의 해당 부분만 매핑됩니다. 그 정의를 볼 수 있습니다.arch/x86/include/asm/cpu_entry_area.h
: 포함되어 있습니다
- 글로벌 데이터 테이블;
- 엔트리 스택;
- 교통 보안 서비스;
- 트램폴린 세트;
- 예외 스택;
- 디버그 저장소 및 버퍼.
트램폴린에는 시스템 호출의 진입점이 포함되어 있습니다.arch/x86/entry/entry_64.S
64비트 호출의 진입점을 정의합니다.
이들 중 어느 것도 링 3에서 직접 액세스할 수 없지만 링 3 코드는 권한 수준 변경을 허용하는 CPU 중재 메커니즘을 사용하여 해당 항목으로 점프할 수 있습니다(예를 들어CPU SYSCALL
명령어).
커널 문서에서페이지 테이블 격리더 많은 배경 정보를 제공하세요.