리눅스

Highmem의 정체

CodePoetry 2015. 10. 1. 23:57

High Memory is the part of physical memory in a computer which is not directly mapped by the page tables of its operating system kernel


4GB RAM일 때 PAGE_OFFSET(3GB)~0xFFFFFF까지의 1GB를 Kernel 공간으로 잡는 것이 일반적인데

이때 896MB 이하를 lowmem(DMA + Normal) 여기는 커널이 물리 메모리에 직접 매핑됨.

그 위를 highmem(128MB)으로 구분하며 이곳은 필요할 때만 kmap()등을 통해 연결해서 사용해야 한다.

커널이 128MB를 사용하는 곳

  • vmalloc 공간
    • 연속적인 커널 가상 주소를 불연속적인 물리 주소로 할당
    • 커널은 불연속적인 물리 주소를 될수있는한 피하려고 한다. 하지만 시스템이 오래 작동하면 커널이 물리메모리를 필요로 할때 연속적인 공간이 없을수도 있게된다. (단편화)
  • Persistent Mapping (high memory mapping)
    • Highmem 영역의 비영구적 페이지를 커널로 매핑할때 사용
  • Fixmaps
    • 물리 주소 공간에서 자유롭게 선택하지만 고정된 페이지와 연관되는 가상 주소 공간 항목

-> 이 말도 사실 잘 이해가 안 된다. 이해를 도와준 말은 아래와 같다.

Kernel에서 ZONE_HIGHMEM을 제외한 공간은 Physical Memory와 1대1 Mapping이 된후 바뀌지 않습니다.
그러나 ZONE_HIGHMEM은 Userspace 영역을 Access 하기 위한 용도로 사용되며 (정확히 이 말은 틀린 것 같다. 'Kernel mode'일 때 라는 말이 들어가야 할 것이다.)
Kernel에서 Access 하고자 하는 Userspace 영역과 Mapping이 일어난후 Access를 할 수 있습니다.
Lowmemory는 Kernel서 맵핑이 변하지 않고 Highmemory는 맵핑이 계속적으로 변한다는 것입니다.
kernel에서 high memory(User space)영역을 Access 하려면 kmap을 이용하여 mapping을 한후에 Access 할 수 있습니다.

약간 느낌은 이렇다.

- 커널이 기본적으로 돌아갈 수 있는 896MB는 직접 매핑으로 커널에 상주해야 마땅하다.

- 나머지는 user space를 위해 최대한으로 확보하고자 한다. 그러므로 3G까지의 가상주소는 사용자 영역이 사용해야 마땅하다.

- 커널도 큰걸 할당하려면 메모리가 더 필요한데 직접 매핑으로는 한계가 있다!

- 시스템이 커널 모드로 동작할 때는 앞의 0~3GB도 커널 가상 주소로 슬쩍 갖다 쓸 수 있다. 이 공간은 당근 가상 메모리 주소로 바로 접근할 수가 없고 페이지 구조체의 주소를 갖고와서 가상 메모리로 변환한 후 커널에 맵핑하여 사용해야 한다.

- RAM 사이즈가 충분히 크면 직접 메모리 맵핑으로 전부 커버가 되기 때문에 highmem size가 0인 경우도 있다는 말은 이 때문이다.

Some operating system kernels, such as Linux, divide their virtual address space into two regions.

When in user mode, translations are only effective for the first region, thus protecting the kernel from user programs, but when in kernel mode, translations are effective for both regions, thus giving the kernel an easy way to refer to the buffers of processes


출처

위키피디아 : https://en.wikipedia.org/wiki/High_memory

linux mm : http://linux-mm.org/HighMemory

쉬운말 : http://egloos.zum.com/slgi97/v/10973585

중간 : http://egloos.zum.com/hermes2/v/839611

깔끔하고 자세 : http://libsora.so/posts/system-programming-memory-management/

구글 검색 : https://www.google.co.kr/?gfe_rd=cr&ei=xD0NVufVFsTU8AeaprFw#newwindow=1&safe=off&q=%EC%BB%A4%EB%84%90+highmem