문제

1GB 이상의 RAM을 해결하기 위해 HighMEM의 필요성을 이해하는 데있어 무언가를 놓치고 있습니다. 누군가 내가 어디로 가고 있는지 지적 할 수 있습니까? 감사!

내가 아는데 것을:

  • 1GB 프로세스의 가상 메모리 (높은 메모리 영역)는 커널 작업을 위해 예약되어 있습니다. 사용자 공간은 나머지 3GB를 사용할 수 있습니다. 이것은 3/1 분할입니다.

  • VM의 가상 메모리 기능은 (연속) 가상 메모리 페이지를 실제 페이지 (RAM)에 매핑합니다.

내가 모르는 것 :

  • 커널 가상 메모리를 사용하는 작업은 무엇입니까? 커널 공간의 Kmalloc (...)과 같은 것들이 커널 가상 메모리를 사용한다고 생각합니다.

  • 나는이 계획에 따라 4GB의 RAM이 사용될 수 있다고 생각한다. 물리적 공간을 해결할 때 커널 1GB 가상 공간이 제한 요인 인 이유를 알지 못합니다. 이것은 나의 이해가 무너지는 곳입니다. 조언하십시오.

나는 이것을 읽고있다 (http://kerneltrap.org/node/2450), 그것은 훌륭합니다. 그러나 그것은 내 좋아하는 것에 대한 내 질문을 제대로 다루지 않습니다.

도움이 되었습니까?

해결책

커널 가상 공간이 유용한 물리적 메모리에 제한적인 요소 인 이유는 커널이 모든 물리적 메모리에 액세스해야하며 물리적 메모리에 액세스하는 방식은 커널 가상 주소를 통해 이루어지기 때문입니다. 커널은 물리적 메모리 위치에 직접 액세스 할 수있는 특수 지침을 사용하지 않습니다. 대화하려는 물리적 범위에 대한 페이지 테이블 항목을 설정해야합니다.

"구식"체계에서 커널은 모든 프로세스의 페이지 테이블이 가상 주소를 매핑하도록 설정했습니다. 0xC0000000 에게 0xFFFFFFFF 물리적 주소로 직접 0x00000000 에게 0x3FFFFFFF (이 페이지는 링 0- 커널 모드에서만 액세스 할 수 있도록 표시되었습니다). 이것들은 "커널 가상 주소"입니다. 이 체계에 따라 커널은 MMU와 함께 맵핑을 변경하지 않고도 물리적 메모리 위치를 직접 읽고 쓸 수 있습니다.

Highmem 체계에서 커널 가상 주소에서 물리적 주소로의 매핑은 고정되지 않았습니다. 물리적 메모리의 일부는 해당 메모리에 액세스 할 필요가 있으므로 커널 가상 주소 공간에 매핑됩니다. 이를 통해 더 많은 물리적 메모리를 사용할 수 있지만 가상으로 물리적 매핑을 지속적으로 변경 해야하는 비용으로 상당히 비싼 작업입니다.

다른 팁

각 프로세스에서 1GB를 커널에 매핑하면 컨텍스트 스위치를 수행하지 않고 프로세스가 커널 모드로 전환 할 수 있습니다. 다음과 같은 시스템 호출에 대한 응답 read(), mmap() 그런 다음 다른 사람들은 호출 프로세스 주소 공간에서 적절하게 처리 될 수 있습니다.

커널의 공간이 각 프로세스에서 예약되지 않은 경우 사용자 공간 코드 실행 사이에서 "커널 모드"로 전환하면 시스템 호출에 대한 하드웨어 MMU (메모리 관리 장치)를 통해 가상 주소 매핑을 사용할 수 없습니다. 서비스 중.

1GB 이상의 물리적 메모리가있는 32 비트 커널을 실행하는 시스템은 물리적 메모리 위치를 할당 할 수 있습니다. ZONE_HIGHMEM (1GB 마크 이상)는 특정 작업이 상호 작용하기 위해 커널이 후프를 뛰어 넘어야 할 수 있습니다. PAE (물리적 주소 확장)를 추가하면 최대 64GB의 물리적 메모리를 허용하여 1GB 물리 주소 메모리 내에서 메모리의 비율을 감소 시켜이 문제를 확장합니다. ZONE_HIGHMEM.

  1. 예를 들어 시스템 호출은 커널 공간을 사용합니다.
  2. 64GB의 실제 RAM을 가질 수 있지만 32 비트 플랫폼에서 프로세서는 32 비트 가상 주소로 인해 4GB 만 액세스 할 수 있습니다. 실제로, 당신은 1GB의 RAM과 3GB의 스왑을 가질 수 있으며 가상 주소는 4GB가있는 것처럼 보일 수 있습니다. 64 비트 플랫폼에서 가상 주소 지정은 실제로 무제한입니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top