ZONE 타입

리눅스에서 메모리 주소 영역을 특별히 획득할 수 있는 ZONE 단위로 구분하여 관리한다. 각각의 ZONE은 다음과 같다.

  • ZONE_DMA
  • ZONE_DMA32
  • ZONE_NORMAL
  • ZONE_HIGHMEM
  • ZONE_MOVABLE

 

ZONE_DMA & ZONE_DMA32

DMA(Direct Memory Access)를 사용하여 메모리에 직접 접근하는 디바이스들을 사용하는 시스템에서 DMA를 사용하는 디바이스가 해당 시스템이 사용하는 주소 버스를 모두 커버하는 경우에는 별도로 ZONE_DMA를 구성할 필요 없이 기본 적으로 만들어지는 ZONE_NORMAL을 사용하여 메모리를 할당받아 사용할 수 있다. 그러나 DMA를 사용하는 디바이스가 시스템이 지원하는 물리 메모리 주소보다 작은 경우에는 별도로 ZONE_DMA를 구성해서 DMA 디바이스용으로 메모리 할당을 제한된 주소 미만으로 만들어놔야 그 DMA 디바이스가 접근할 수 있게된다. x86 및 arm의 경우 다음과 같은 조건에 따라 CONFIG_ZONE_DMA 및 CONFIG_ZONE_DMA32 사용 유무를 결정해서 사용한다.

  • DMA를 사용하는 디바이스 장치의 주소 버스가 시스템의 최대 물리 메모리 접근 주소까지 접근될 수 있게 설계된 경우 CONFIG_DMA를 설정할 필요 없다.
    • 32bit & 64bit arm:
      • default 로 사용하지 않는다.
  • DMA를 사용하는 디바이스 장치의 주소 버스가 시스템의 최대 물리 메모리 접근 주소보다 접근할 수 없는 경우 CONFIG_DMA를 설정해서 사용한다.
    • 32bit x86:
      • CONFIG_ZONE_DMA 사용
    • 64bit x86:
      • CONFIG_ZONE_DMA 사용
      • 추가로 CONFIG_ZONE_DMA32 사용
        • 4G 영역(32bit 주소)을 사용하는 DMA 장치를 지원하기 위해 사용된다.
    • 32bit & 64bit arm:
      • 32bit 및 64bit 둘 다 CONFIG_ZONE_DMA 사용 (64bit도 CONFIG_ZONE_DMA 사용)
      • 회로(Circuit) 구성을 단순하게 할 필요성이 있는 경우 해당 아키텍처가 필요로 하는 만큼의 주소 버스를 사용하지 않고 줄여서 설계된 DMA 디바이스 장치를 사용하는 경우 사용한다.

 

DMA 사이즈 설정

  • 32bit x86
    • 16MB로 고정되어 자동 구성된다.
    • 24bit address bus를 사용한 AT(80286) 시스템에 채용된 ISA 버스에서 동작하는 디바이스를 호환(backward compatible)시키기 위해 사용된다
  • 64bit x86
    • 4GB로 고정되어 자동 구성된다.
    • 32bit address만을 사용하는 기존 버스들(32bit EISA, PCI,  24bit ISA, …)에서 동작하는 디바이스를 호환시키기 위해 사용된다.
  • 32bit & 64bit ARM
    • CONFIG_DMA를 사용하는 경우 DMA size가 flexible하게 구성된다.
    • 임베디드 시스템 회로(Circuit) 구성이 DMA 디바이스 장치에서 제한된 address bus 핀(pin)만 사용하는 경우 그 지정할 수 있는 주소만큼 영역을 제한시킨다.
      • 예) arm32에서 DMA 디바이스 장치가 28 bit address bus를 지원하는 경우
        • DMA size는 256MB로 설정해야 한다.
      • 예) arm64에서 DMA 디바이스 장치가 32 bit address bus를 지원하는 경우
        • DMA size는 4GB로 설정해야 한다.

 

다음 그림은 DMA를 사용하는 디바이스 장치가 어느 때 CONFIG_DMA를 설정해야 하는지를 나타낸다.

zone-dma-1

  • DMA를 사용하는 디바이스 장치가 32비트 주소를 지원하므로 특별히 ZONE_DMA를 설정할 필요 없다.

 

zone-dma-2

  • DMA를 사용하는 디바이스 장치가 제한된 24비트 주소만을 지원하는데 32비트 주소로 할당된 메모리는 디바이스 장치에서 접근할 수 없다.

 

zone-dma-3

  • DMA를 사용하는 디바이스 장치가 제한된 24비트 주소만을 지원하므로 관련 메모리 할당을 ZONE_DMA 영역에서 할당을 받아 사용한다.
    • ZONE_DMA 사이즈를 64MB(2^26)로 설정하여 사용한다.

 

ZONE_NORMAL

  • 시스템에서 지원하는 물리 메모리가 아키텍처의 가상 주소에 1:1로 매핑되어 사용할 수 있는 만큼의 영역이다. 따라서 kernel에서 매우 빠르게 접근할 수 있는 메모리 영역이다.
    • 물론 ZONE_DMA 및 ZONE_DMA32도 가상 주소에 1:1로 매핑되어 있다.
    • 32bit 시스템에서는 4G의 공간을 user space와 kernel space로 나누어 사용하므로 user space는 비워두고 kernel space의 일부 영역만을 ZONE_NORMAL로 구성하여 사용한다.
      • 32bit arm
        • 커널 크기 구성에 따라 다르다.
          • CONFIG_VMSPLIT_3G
            • normal zone의 최대 영역 크기=760MB
            • user space가 3G, kernel space가 1G
            • 대부분의 PC 리눅스와 임베디드 커널에서 사용한다.
          • CONFIG_VMSPLIT_2G
            • normal zone의 최대 영역 크기=1GB + 760MB
            • user space가 2G, kernel space가 2G
            • 라즈베리파이2 및 일부 임베디드 시스템이 사용하는 설정이다.
          • CONFIG_VMSPLIT_1G
            • normal zone의 최대 영역 크기=2GB + 760MB
            • user space가 1G, kernel space가 3G
            • 극단적인 설정이라 거의 사용되지 않는다.
      • 32bit x86
        • normal zone의 최대 영역 크기=896MB
    • 64bit 시스템에서는 물리 메모리 모두(보통 48bit – 256TB)를 64bit 가상 주소에 매핑하여 사용할 수 있다.

 

다음 그림은 32bit 시스템에서의 ZONE_NORMAL 영역이 제한되어 있음을 보여준다.

zone-2a

 

ZONE_HIGHMEM

  • ZONE_NORMAL이 처리하지 못하는 메모리 영역이 모두 ZONE_HIGHMEM으로 구성된다.
    • user 에서는 어떠한 공간이든 각 task 별로 매핑을 하여 사용하지만 kernel에서는 최대한 빠른 속도를 얻기 위해 ZONE_DMA(DMA32) 및 ZONE_NORMAL에서는 물리 메모리와 가상 메모리를 미리 1:1로 매핑하여 사용을 한다.
    • 그러나 물리 메모리가 커널로의 1:1 매핑을 허용하는 영역 크기를 초과하는 경우 이 영역을 CONFIG_ZONE_HIGHMEM 영역으로 구성하여 커널에서 사용할 때에는 필요할 때마다 매핑하여 사용한다.
      • 32bit 시스템에서는 1:1 매핑이 일부만 가능하기 때문에 ZONE_NORMAL을 초과하는 메모리가 이 영역을 사용한다.
      • 64bit 시스템에서는 모든 물리 메모리가 1:1 매핑이 가능하므로 ZONE_HIGHMEM을 사용하지 않는다.

 

ZONE_MOVABLE

이 영역은 NUMA 시스템에서 사용되며 아래와 같은 용도로 구성하여 사용한다.

  • 두 가지 용도에 대한 구성
    • 마지막 zone에 대해서 각 노드의  일부 영역을 할당하여 버디 시스템으로 구현된 페이지 할당자가 메모리 파편화를 막기 위해 이 영역을 전용으로 사용한다.
      • 이 영역을 구성하지 않아도 버디 시스템은 migration 타입으로 분류하여 최대한 파편화를 막는데, 이 영역을 지정하는 경우 이 영역 전체가 movable 페이지 구성이 되므로 파편화를 막는데 더욱 큰 효율을 보일 수 있다.
      • 마지막(last) zone이란 것은
        • 시스템에 설치된 zone 중 가장 상위에 존재하는 zone으로 시스템에 따라 가장 다른데 아래와 같이 높은 순부터 낮은 순으로 나열한다.
          • ZONE_HIGHMEM -> ZONE_NORMAL -> ZONE_DMA(또는 ZONE_DMA32)
            • ZONE_HIGHMEM이 없는 64비트 시스템에서는 ZONE_NORMAL이 될 수 있고 그것도 없는 경우 ZONE_DMA(또는 ZONE_DMA32)가 될 수 있다.
    • 버디 시스템의 메모리 파편화도 막으면서 동시에 최근에 구현된 “메모리 Hotplug”를 지원하기 위해 메모리 Hotplug를 원하는 노드 전체를 ZONE_MOVABLE로 구성하여 사용한다.

 

다음 그림은 NUMA 32bit ARM 시스템에서의 ZONE_MOVABLE 구성을 보여준다.

zone-3

 

다음 그림은 NUMA 64bit ARM 시스템에서의 ZONE_MOVABLE 구성을 보여준다.

zone-4

참고

 

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.