Linux 프로세스의 가상 메모리 공간의 커널 부분을 갖는 용도는 무엇입니까?

Linux 프로세스의 가상 메모리 공간의 커널 부분을 갖는 용도는 무엇입니까?

비슷한 질문을 찾았지만 여전히 내 질문에 답변하지 못했습니다. 모든 프로세스의 가상 주소 공간이 "커널" 부분에 동일한 내용을 가지고 있습니까?

  1. 먼저 이 부분에 사용자 프로세스가 접근할 수 없다는 점을 고려하면, 접근하려고 하면 에러가 날 것 같은데 왜 이 부분을 사용자 프로세스 가상공간에 포함시키는 걸까요? 이 부분이 중요하고 유용한 실제 시나리오를 알려주실 수 있나요?

  2. 또한 한 가지 질문은 저는 항상 메모리의 커널 부분이 동적이라고 생각했는데, 이는 예를 들어 프로그램에서 동적 라이브러리를 사용할 때 메모리가 커질 수 있다는 것을 의미합니다. 이것이 사실입니까? 그렇다면 운영 체제는 프로세스 가상 공간에서 커널의 크기를 어떻게 결정합니까?

  3. 실제 메모리의 커널이 커지거나 변경되면 모든 프로세스에 대한 가상 메모리의 커널 부분에 동일한 효과가 발생합니까? 이 가상 코어와 실제 코어 간의 매핑은 일대일 매핑입니까?

여기에 이미지 설명을 입력하세요

답변1

  1. 커널 매핑은 사용자 프로세스의 목적이 아닌 주로 커널의 목적으로 존재합니다. CPU의 관점에서 볼 때 선형 주소로 매핑되지 않은 물리적 메모리 주소는 존재하지 않을 수 있습니다. 그러나 CPU는 커널을 호출할 수 있어야 합니다: 서비스 인터럽트, 예외 처리... 또한 사용자 프로세스가 시스템 호출을 실행할 때 커널을 호출할 수 있어야 합니다(이를 수행하는 방법에는 여러 가지가 있습니다). 자세한 내용은 다루지 않겠습니다.) 대부분의(전부는 아니지만) 아키텍처에서 이는 페이지 테이블을 전환할 기회 없이 발생합니다. 예를 참조하세요.SYSENTER. 따라서 최소한 커널의 진입점은 항상 현재 주소 공간에 매핑되어야 합니다.

  2. 핵심분배하다동적이지만 주소 공간은 그렇지 않습니다. 32비트 x86에서는 그림에 표시된 3/1 GiB 분할과 같은 다양한 분할을 사용할 수 있습니다. 64비트 x86에서는 주소 공간의 위쪽 절반이 커널용으로 예약되어 있습니다.메모리 맵커널 문서에서). 균열은 이동할 수 없습니다. (라이브러리는 사용자 공간에 로드됩니다. 커널 모듈은 커널 공간에 로드되지만 이는 주소 공간 분할이 아닌 할당만 변경합니다.)

  3. 사용자 모드에서 커널은 모든 프로세스에서 공유되는 맵을 갖습니다. 커널 측 페이지 매핑이 변경되면 변경 사항이 모든 곳에 반영됩니다.

    KPTI가 활성화되면 커널에는 사용자 공간 코드를 실행할 때 노출되지 않는 자체 개인 매핑이 있으므로 KPTI에는 두 개의 매핑이 있으며 커널의 개인 매핑에 대한 변경 사항은 사용자 공간에 표시되지 않습니다. 이것이 바로 KPTI의 중요성입니다. ).

    커널 메모리 맵은 항상 모든 코어를 매핑하지만(KPTI를 실행할 때 커널 모드에서) 반드시 일대일일 필요는 없습니다. 예를 들어 64비트 x86에서는 물리적 메모리의 완전한 매핑을 포함하므로 모든 코어가 물리적으로 주소는 최소한 두 번 매핑됩니다.

답변2

또 다른 팁은 관리 서비스를 수행하고 사용자 애플리케이션에 서비스를 제공하기 위해 항상 활성화되어야 한다는 커널 정의에 대한 보다 일반적인 이해를 기반으로 합니다. 이러한 활성은 실제로 각 프로세스 내에서 커널을 논리적으로 바인딩하여 달성됩니다.

단일 프로세서 시스템 환경에서 여러 프로세스가 실행되고 있다는 점을 고려하면 이는 의미가 있습니다.또한 프로세스 구조에 커널 매핑이 포함되어 있지 않다는 점도 고려하세요.. 프로세서가 하나뿐이므로 프로세스 실행이 예약되면 해당 프로세스가 CPU를 점유하고 있기 때문에 코어가 활성 상태가 아니라는 의미이며 프로세스에 사용 가능한 커널 맵이 없다고 가정합니다. 이제 논리적인 질문은 커널이 서비스를 어떻게 수행할 것인가이며, 해결책은 커널을 각 프로세스에 매핑하는 것입니다.

이것이 바로 모든 사람이 창조주와 연결되어 있다고 믿는 방법입니다.

관련 정보