저는 현재 Linux 커널의 가상 주소 공간 사용을 연구하고 있습니다. 나는 이것들의 이점, x86에서 페이지 테이블 탐색이 작동하는 방식 및 가상 레이아웃을 이해합니다.주소 공간.
제가 이해하지 못하는 부분은 다음과 같습니다. 제 강연 중 누군가가 Linux 커널이 커널 공간에서 "ID 매핑"을 사용한다고 설명했습니다. 의미: 커널 공간에서는 상수를 빼서 가상 주소를 실제 주소로 변환할 수 있습니다.
이 번호는 흔히 불린다.페이지 오프셋그리고 64비트와 32비트, 레이어 4와 레이어 5 주소 변환에 따라 달라집니다.구성된. 보안 조치로 kASLR은 시작할 때마다 PAGE_OFFSET을 무작위로 증가시킵니다.
나는 이것이 여러 곳에서 설명되는 것을 보았지만 대부분은 약간 오래되었습니다.
https://stackoverflow.com/a/36640733/15113903
https://stackoverflow.com/questions/24632905/mapping-of-kernel-virtual-address-directly?rq=1
최근 암시적인 설명은 변동성3이 변동성을 계산할 때 이러한 ID 매핑에 의존하는 것 같다는 것입니다.kASLR 메모리 덤프 오프셋.
이제: (왜) 커널 가상 주소 공간은 (여전히) 이렇습니까? 성능상 이점이 있나요? 어떤 이유에서든 필요한가요? 이게 초창기의 유산인가요? 가까운 미래에 바뀔 가능성은 얼마나 됩니까?
감사해요
답변1
상수를 빼면 가상 주소를 실제 주소로 변환할 수 있습니다.
불완전합니다. 주소 공간의 커널 끝 부분에 가상 주소가 있습니다.
x86을 포함한 일부 아키텍처의 Linux 커널에는 여전히 물리적 주소 공간과 가상 주소 공간의 선형 매핑이 있습니다. 많은 장점이 있습니다:
- TLB 압력 감소(대형 페이지 매핑에 도움이 되며 커널은 가능한 경우 이 매핑에 TLB를 사용합니다)
- 물리적 주소에 대한 직접적인 접근(MMU를 사용하면 CPU에서 실행되는 코드는 가상 주소에만 접근할 수 있다는 점을 기억하세요)
- 매핑되지 않은 주소에 액세스(현재 프로세스가 아닌 다른 프로세스에서 사용 중이거나 전혀 매핑되지 않았기 때문에)
이것은 어려운 요구 사항이 아니며 어떤 사람들은 어느 시점에서 선형 지도에서 벗어나고 싶어하지만 적극적으로 작업하는 사람이 있는지는 모르겠습니다.