특정 가상 주소, 커널 또는 MMU의 물리적 주소는 누가 결정합니까?

특정 가상 주소, 커널 또는 MMU의 물리적 주소는 누가 결정합니까?

운영체제를 실행할 때 물리적 주소가 어떻게 할당되는지 이해하려고 합니다.

내 질문은 커널이 일부 메모리를 할당할 때(kmalloc을 사용한다고 가정) 누가 해당 가상 메모리 범위에 매핑되어야 하는 물리적 메모리 주소 범위를 결정하는가입니다.

내가 아는 한, 커널은 가상 매핑을 물리적 매핑으로 변환하기 위해 페이지 테이블을 생성하고 MMU는 이를 사용합니다. 하지만 그 전에 누군가 매핑할 물리적 페이지를 할당/할당해야 합니다. 이것은 커널 자체에 의해 수행됩니까, 아니면 MMU가 커널이 사용할 수 있는 특정 물리적 주소 범위를 알 수 있도록 합니까?

커널 자체가 물리적 주소를 할당하는 경우 어떤 물리적 주소가 사용되고 어떤 것이 사용 가능한지 추적하는 방법은 무엇입니까?

답변1

운영체제를 실행할 때 물리적 주소가 어떻게 할당되는지 이해하려고 합니다.

물리적 주소는 할당되지 않고 이미 존재합니다. RAM입니다.

내 질문은 커널이 일부 메모리를 할당할 때(kmalloc을 사용한다고 가정) 누가 해당 가상 메모리 범위에 매핑되어야 하는 물리적 메모리 주소 범위를 결정하는가입니다.

대상: 커널 메모리 매핑 알고리즘. 그래서, 커널.

하지만 그 전에 누군가 매핑할 물리적 페이지를 할당/할당해야 합니다.

앞서 언급했듯이 물리적 메모리는 커널이 처리해야 하는 현실입니다.

세그먼트화된 연속 메모리 범위를 형성하기 위해 메모리 칩이 어떻게 매핑되는지에 대한 질문은 하드웨어와 부팅 프로세스에 따라 다릅니다. 데스크탑 또는 서버 x86에서 일반적으로 부팅 중에 DRAM 컨트롤러를 초기화하면 펌웨어(또는 부트로더)는 DRAM 메모리 모듈("DIMM") "구성 EEPROM"의 내용을 읽고 CPU 메모리를 구성합니다. 컨트롤러(또는 마더보드) , 하드웨어의 세부 사항에 따라 다름)은 메모리 주소 액세스를 읽기로 변환하고 이에 따라 이러한 칩에 쓰기를 수행합니다. 임베디드 플랫폼에서는 RAM 구성을 소프트웨어에 간단히 적용할 수 있으며(예를 들어 uboot 및 Linux 커널은 하드웨어를 초기화하기 위해 장치 트리를 사용합니다) 그런 다음 메모리 컨트롤러가 그런 방식으로 구성됩니다.

따라서 여기에는 보편적인 대답이 없습니다. "동적 메모리를 처리하는 방법"은 아키텍처가 다른 주요 사항 중 하나입니다. i386의 PAE를 기억하면 매우 상세하고 CPU 모델에 따라 달라질 수 있습니다.

이 가상 메모리 범위에 매핑되어야 하는 물리적 메모리 주소 범위를 누가 결정합니까?

방법에 대해 이야기해 보겠습니다. 커널은 하드웨어나 펌웨어 인터페이스 또는 구성 파일을 통해 물리적 주소 공간에 물리적 메모리가 얼마나 있는지, 메모리 매핑된 IO가 어디에 있는지, 이미 사용하고 있는 메모리가 무엇인지 알고 있으므로, 유휴 실제 메모리 데이터 구조를 추적할 수 있습니다. 따라서 kmalloc특정 크기로 호출할 때 크기 요구 사항과 일치하는 사용되지 않은 실제 메모리를 찾고 있습니다.

답변2

이것은 매우 간단합니다.

  • 처음에 CPU는 부팅 프로세스의 일부로 MMU를 재설정합니다.
  • 커널은 물리적 메모리(RAM)를 감지하고 kmalloc할당할 수 있는 데이터 구조를 구축합니다. 커널 코드가 상주하는 RAM은 제외됩니다.
  • 커널이 /sbin/init처음에 프로세스( )를 실행하기로 결정하면 필요한 내부 테이블과 RAM 블록을 할당하여 실행 파일에 매핑합니다.
  • 그런 다음 프로세스 정렬의 일부로 "페이지 테이블"을 사용하여 각 프로세스가 위치 0에서 시작하는 메모리 공간을 볼 수 있도록 MMU를 설정하고 위치 0은 해당 프로세스에 고유합니다. 모든 프로세스의 위치 0은 유독합니다. SEGV - segment violation이를 사용하면 a를 얻게 됩니다. 초기화되지 않은 포인터를 감지합니다.
  • CPU가 "하이퍼바이저" 모드(하드웨어 상태)에 있으면 MMU가 비활성화됩니다. MMU는 커널이 프로세스에 제어권을 넘기고 "하이퍼바이저" 모드를 지울 때 적용됩니다.
  • 이제 활성화된 MMU는 CPU<->RAM 하드웨어 경로에 자신을 삽입하므로 이제 CPU<->MMU<->RAM이 됩니다.
  • CPU가 발행한 각 주소의 상위 비트는 CPU가 인터럽트를 통해 "관리자" 모드로 돌아갈 때까지 페이지 테이블의 비트로 대체됩니다.

관련 정보