2014-09-24 3 views
6

리눅스 커널과 MMU 사이의 관계에 대해 질문이 있습니다. 리눅스 커널이 가상 메모리 주소와 물리적 메모리 주소 사이에서 페이지 테이블을 관리한다는 요점이 있습니다. 동시에 가상 메모리 주소와 물리적 메모리 주소 사이의 페이지 테이블을 관리하는 x86 아키텍처에 MMU가 있습니다. MMU가 CPU 근처에 있으면 커널이 여전히 페이지 테이블을 처리해야합니까?리눅스 페이지 테이블 관리 및 MMU

이 질문은 어리석은 질문 일 수 있습니다. 그러나 MMU가 메모리 공간을 관리하고 누가 높은 메모리와 낮은 메모리를 관리한다면이 질문은 다른 것입니까? 커널이 MMU (32 비트에서 4GB)에서 가상 메모리의 크기를 받으면 커널은 가상 주소의 사용자 공간과 커널 공간을 구별합니다. 맞습니까? 또는 완전히 틀린가?

미리 감사드립니다.

+0

리눅스는 MMU가없는 하드웨어에서 실행될 수 있으므로 커널은 번역 방법을 알아야합니다. 그러나 x86에서는 믿을 만하며 MMU를 사용합니다. –

+0

나는 Gennadi의 의견에 두 번째. x86 아키텍처에서 MMU는 가상 주소를 실제 주소로 변환하지만 커널은 커널에 속한 페이지와 사용자 프로세스에 속한 페이지를 추적합니다. 나는 [이] (http://www.tldp.org/LDP/tlk/mm/memory.html)이 일들이 어떻게 작동하는지에 관해 밝힐 수 있다고 믿는다. –

답변

5

OS 및 MMU 페이지 관리 책임은 아키텍처와 마이크로 아키텍처 사이의 경계에있는 동일한 메커니즘의 두 측면입니다.

첫 번째 측면은 하드웨어와 그 위에 실행되는 소프트웨어 (이 경우 OS) 간의 "계약"을 정의합니다. 가상 메모리를 사용하려면 페이지 테이블을 만들고 유지 관리해야합니다. 그 계약. 한편, MMU 측은 주소 변환의 HW 작업 수행을 담당하는 하드웨어 장치입니다. 여기에는 하드웨어 최적화가 포함되거나 포함되지 않을 수 있습니다. 일반적으로 숨겨져 있으며 계약의 하드웨어 측면을 유지하는 한 다양한 방법으로 구현 될 수 있습니다.

이론상, MMU는 필요한 동작을 달성하기 위해 이론적으로 각 번역 (페이지 보행)에 대한 일련의 메모리 액세스를 발행하기로 결정할 수 있습니다. 그러나 성능이 중요한 요소이기 때문에 대부분의 MMU는 캐시가 이전 액세스 결과를 저장하는 것처럼 이전 페이지 탐색 결과를 TLB 내부에 캐싱하여이를 최적화합니다 (실제로 일부 구현에서는 캐시 자체에 페이지 테이블에 대한 액세스는 일반적으로 캐시 가능한 메모리에 있기 때문에). MMU는 여러 TLB를 관리 할 수 ​​있으며 (대부분의 구현은 데이터 및 코드 페이지 용으로 분리되어 있고 일부는 2 차 TLB가 있음) 빠른 액세스 시간을 제외하고는이를 인식하지 않고도 거기에서 변환을 제공합니다.

또한 하드웨어는 예를 들어 페이지 앨리어싱 또는 사용 중 재 매핑과 같은 이전 번역의 TLB "캐싱"의 일관성에 해를 줄 수있는 많은 코너 케이스를 방지해야합니다. 일부 컴퓨터에서는 더 이상한 케이스가 아니라 TLB shootdown이라는 거대한 플러시 플로우가 필요합니다.

+1

특히 커널과 사용자 공간의 분리에 관한 질문의 일부를 다루는 것이 적절합니다. (전 * 리눅스가 커널 공간에 대해 (전역) 음수 주소를 사용한다고 생각합니다. x86의 경우 x86 하위 페이지의 상위 (네거티브) 절반은 커널 서브 테이블을 매핑하는 계층 적 페이지 테이블의 상단에 하나의 페이지가 필요합니다. ARM Linux 커널이 사용하는 별도의 글로벌 페이지 테이블을 지원합니다. Power의 해시 페이지 테이블은 Linux에서 메인 테이블 용으로 사용되지 않으며 최신 디렉토리 항목 캐싱 시스템은 Linux의 기본 테이블 포맷과 맞습니다. –