2013-08-05 1 views

답변

0

함수에 전달 된 플래그에 따라 모든 메모리 할당 요청 (예 : kmalloc을 통해)에 대해 커널이 메모리 영역을 선택합니다. 이러한 요청은 커널 함수 alloc_pages()를 내부적으로 트리거합니다.

zonelist가 선호하는 순서에서는, zonelist 데이터 구조 포인트 나타내는 것을 alloc_pages()에 전달되는 인수이고, 메모리 할당에 적합한 한 MEM ORY 영역.

2

이 메모리 영역에만 32 개 비트 시스템이 아닌 64 비트에 정의 된 리눅스 커널을 이해 책에서 메모리 관리 장을 참조하십시오.

이들을 기억할 수있는 커널은 main memory입니다. 32 bit (4GB) 시스템에서 커널과 사용자 공간 사이의 간격은 1:3입니다. 의미 커널은 1GB 및 사용자 공간 3GB에 액세스 할 수 있습니다. 커널의 1GB는 다음과 같이 나뉩니다.

Zone_DMA (0-16MB) :커널 주소 공간에 영구적으로 매핑됩니다.
주 메모리의 하위 16MB 만 처리 할 수있는 구형 ISA 장치와의 호환성을 위해.

Zone_Normal (16MB-896MB) :커널 주소 공간에 영구적으로 매핑됩니다.
많은 커널 작업은 만 수행 할 수 있으므로 ZONE_NORMAL을 사용하여 성능이 가장 중요한 영역이며 커널이 주로 할당하는 메모리입니다.

ZONE_HIGH_MEM (896MB 이상) :은 커널의 주소 공간에 영구적으로 매핑되지 않습니다.
커널은 전체 4GB 주 메모리에 액세스 할 수 있습니다. 커널의 1GB는 Zone_DMA & Zone_Normal이고 사용자의 3GB는 ZONE_HIGH_MEM입니다. 인텔의 Physical Address Extension (PAE)을 사용하면 주 메모리를 주소 지정하기 위해 4 개의 추가 비트가 생겨 36 비트가되며 총 64GB의 메모리에 액세스 할 수 있습니다. 델타 주소 공간 (36 비트 주소 - 32 비트 주소)은 ZONE_HIGH_MEM이 사용자 액세스 주 메모리 (예 : 2GB - 4GB)에 매핑하는 데 사용됩니다.

더 읽기 :

http://www.quora.com/Linux-Kernel/Why-is-there-ZONE_HIGHMEM-in-the-x86-32-Linux-kernel-but-not-in-the-x86-64-kernel
그것은 각 영역의 영역의 우선 순위와 요구를 발행 한 CPU와 관련된 NUMA 노드에서 사용 가능한 페이지 수에 따라 달라집니다 http://www.quora.com/Linux-Kernel/What-is-the-difference-between-high-memory-and-normal-memory
Linux 3/1 virtual address split

+1

이것은 매우 정확하지 않습니다 - DMA32 영역은 x86-64 아키텍처에 존재하며 그 소개는 여기에 설명되어 있습니다 : http://lwn.net/Articles/152337/ - 기본적으로 DMA와 동등합니다. 그것. 다른 커널 메모리 사용량은 보통으로 끝나지 만 충분한 공간이 없으면 DMA32로 갈 것입니다 (예 : 3GB 만 있으면 대부분 DMA32 영역에있을 가능성이 있으므로이를 사용해야합니다). – GreenReaper

+0

예, GreenReaper, 나도 알아 챘습니다. –

관련 문제