
나는 이 질문에 대해 생각했습니다.
Linux 프로세스의 가상 메모리 공간의 커널 부분을 갖는 용도는 무엇입니까?
그리고 답변에 대한 답변과 의견을 바탕으로:
커널 메모리 맵에는 모든 물리적 메모리의 직접 매핑이 포함되어 있으므로 메모리의 모든 항목이 여기에 나타나며 커널, 모듈 등의 별도 매핑도 포함되므로 커널을 포함하는 물리적 주소는 최소한 두 개의 서로 다른 맵에 나타납니다.
이거 진짜야? 소스나 참조를 찾을 수 없습니다. 전체 물리적 메모리에 대한 매핑과 별도의 커널 모듈 매핑이 포함된 이유는 무엇입니까? 이것은 중복되지 않습니까?
64비트 Linux에서 프로세스 가상 메모리의 커널 부분이 무엇인지 간단히 설명해 줄 수 있는 사람이 있습니까? 그리고답변의 출처를 알려주세요! 그 어떤 책이나 논문에서도 이와 관련된 내용을 찾을 수 없기 때문입니다.
답변1
x86-64의 커널 메모리 맵은 다음과 같습니다.커널 자체에 문서화되어 있음. 커널 맵
- 사용자 공간(현재 프로세스)
- PTI 데이터 구조
- 모든 물리적 메모리
- 다양한 블록에 위치한 커널의 데이터 구조에는 ASLR 취약점이 있습니다.
- 커널 자체
- 모듈
물리적 메모리를 완전히 매핑하는 것은 편리하지만 이로 인해 발생하는 보안 위험과 주소 공간 부담(물리적 메모리는 사실상 주소 공간의 절반으로 제한되기 때문에 최근 확장이 촉발됨)에 비해 관련성은 논쟁의 여지가 있습니다. 56비트 주소를 가진 레벨 페이지 테이블).
답변2
"64비트 메모리는 엄청납니다. 그것이 얼마나 거대하고, 거대하고, 믿을 수 없는지 믿을 수 없습니다. 즉, 화학자가 되려면 아직 멀었다고 생각할 수도 있지만, 64비트 메모리로서는 너무 큽니다. 공간적인 측면에서는 사소한 문제일 뿐이죠.”
단순하게 생각하는 것이 좋습니다.
따라서 하드웨어 주소를 일대일로 매핑하는 하드웨어 직접 매핑에 절반을 할당하기로 결정했습니다. 절반은 가상 매핑에 사용됩니다. 무언가를 두 번 버리는 것이 안 버리는 것보다 더 저렴합니다. 다른 지도에 있는 항목을 직접 지도에서 제외하기 위해 조건부 코드를 사용한다고 상상해 보세요. 상황이 얼마나 복잡해질 수 있는지 상상해 보십시오. 이제는 모든 것이 직접 맵에 있지 않으므로 원하는 것을 찾기 위해 더 많은 조건부 코드를 시드합니다. 두 번 매핑하는 것이 더 간단합니다. (지나치게 단순화했을 수도 있고 일부 세부 사항이 잘못되었을 수도 있지만 일반적인 생각은 정확합니다.)