말 그대로 잡설

psycho 2013. 10. 21. 11:16

  몇 년 전부터 32bit 환경에서의 메모리 제한과 관련된 이야기들이 매우 많이 보인다. 램을 4GB를 달았는데 왜 3.25GB만 뜨느냐 같은 질문들부터, 특정 램디스크 소프트웨어를 이용해서 그렇게 버려지는 영역을 활용하는 방법 같은 이야기들이다. 이 글에서는 이런 이야기들의 허와 실을 살펴본다.

 

 1. 아놔... 나 분명 램 4GB짜리 컴을 샀는데 왜 더 적게 뜨나요?

 위에서도 대표적인 예제로 나왔듯이 가장 많이 보이는 질문이다. 왜 그렇게 되었는지 이해하려면 메모리 매핑에 대해 좀 알 필요가 있다. 일단, 32bit 환경에서는 메모리 주소를 32bit로 지정한다는 건 다들 알고 있을 것이다. CPU가 한 번에 처리할 수 있는 데이터를 담는 레지스터의 크기가 32bit이고, 이를 주소 지정에도 동일하게 활용하기 때문이다. 그래서 지정할 수 있는 영역이 0부터 2^32-1, 즉 4,294,967,295까지가 되고 이것이 4GB인 것이다.

 여기까지는 좋다. 문제는, 컴퓨터에 탑재된 하드웨어(비디오 카드, 하드 디스크 컨트롤러, LAN 등)를 사용하기 위해 이 메모리 공간 중에 예약된 영역이 있다는 것이다. 이런 예약된 공간은 극히 오래 전부터 있어왔지만, 사용할 수 있는 메모리 공간에 가장 큰 영향을 미치는 것은 PCI hole이다. 이는 PCI 장치에 접근할 때 기존의 I/O 포트를 이용하는 대신 시스템 메모리를 사용하는 것과 동일하게 접근할 수 있도록 예약된 영역이다. 예를 들어, LAN 카드에서 들어오는 입력을 받을 때, I/O 포트를 통하여 데이터를 받도록 프로그램을 만드는 대신 LAN 카드의 버퍼에 메모리 주소를 할당하여 시스템 메모리를 읽는 것과 동일하게 데이터를 가져올 수 있다. 이렇게 하면 장치와 메모리 간의 데이터 이동이 단순해지는 장점이 있고, 그만큼 드라이버 구현의 편의성과 속도 향상에 기여할 수 있다. 이런 예약 영역은 처음 전원이 인가되면 BIOS에서 시스템에 장착된 장치들을 검색한 후 할당하게 되며, 그 크기는 장치의 수와 종류, BIOS의 구현 특성에 따라 다르다.

그림 1. 2GB RAM을 사용하는 시스템의 Memory Map.

 

 문제는 시스템 메모리가 4GB가 되면서 발생한다. 시스템 메모리가 2GB 이하이던 시절에는 이런 PCI 장치들에 할당되는 메모리 주소 영역과 시스템 메모리 영역이 겹치지 않았기 때문에 이것을 아무도 신경쓰지 않았고, 신경쓸 필요도 없었다. 하지만 4GB가 되면 다르다. 주소 공간의 마지막 부분을 PCI hole이나 기타 장치들이 사용하도록 매핑해버리기 때문에 그 주소가 할당되어야 할 시스템 메모리 부분은 사용할 수 없게 되어버리는 것이다. BIOS는 이런 부분을 제외하고 남은 메모리 크기를 보고하게 되고, Windows는 이 값을 사용하게 된다. 메모리 크기를 봤을 때 시스템에 따라 3.5GB부터 시작해서 3.25GB, 3GB, 심지어는 2GB가 나오는 경우도 있는 것은 이 때문이다.

그림 2. 4GB RAM을 사용하는 시스템의 Memory Map.

 

 2. 그러면 저렇게 접근할 수 없게 된 메모리 영역은 전혀 사용할 수 없는 건가요? 램디스크 활용 글 같은 걸 보면 안 그런 것 같은데...

 결론부터 말하자면, 시스템마다 다르다. 이렇게 제대로 매핑되지 않은 영역을 사용하려면 몇 가지 조건을 만족시켜야 한다.

 1) 일단 이 영역에 다른 주소를 할당해줘야 하는데, 이를 Memory remapping이라고 한다. 이를 활성화시키면 PCI 예약 영역과 겹치는 메모리 영역을 4GB 위쪽의 주소로 매핑시킨다. Pentium D 이상을 사용할 수 있는 메인보드의 BIOS에는 이것을 설정할 수 있는 옵션이 있으며, 없는 경우에는 기본적으로 켜져 있다. 하지만, 그건 해당 기능을 지원하는 메인보드일 때의 이야기이다. 일부 구형 칩셋을 사용하는 메인보드에는 이 기능이 없으며, 이 때는 64bit 운영체제 사용을 포함한 어떤 방법을 동원하더라도 이 영역을 사용할 수 없다. 이런 경우라면 해당 메모리 영역을 포기하거나 메인보드를 교체하는 것이 현명할 것이다.

그림 3. 4GB RAM을 사용하는 시스템의 Memory Map(Remapping 적용 시).

 

 2) PAE를 활성화시켜야 한다. PAE는 Physical Address Extension의 약자로, 말 그대로 지정할 수 있는 주소를 확장하는 기술이다. 이는 Pentium II 시절 즈음에 도입되어, 그 이후에 나온 프로세서는 대부분 지원한다. 이를 사용하면 지정할 수 있는 주소를 36bit로 확장시켜 64GB까지 사용할 수 있게 해 주므로, 윗 단계에서 4GB를 초과하는 주소로 매핑된 메모리 영역을 사용할 수 있게 된다. 이 때 착각하면 안 되는 것은 32bit Windows의 커널 자체가 이 영역을 인식하지 못한다는 건 잘못된 이야기라는 것이다. PAE를 지원하고 활성화시킨 Windows 커널은 무조건 이 영역들을 모두 인식하며, 단지 Windows의 개발 정책과 기존 드라이버와의 호환성을 위해 이 영역을 사용하지 않을 뿐이다1. 그렇기 때문에 Windows에서는 PAE를 켠다고 해서 시스템 메모리로서 4GB를 모두 이용할 수는 없는 것이다2. 소위 Unmanaged memory를 사용한다는 램디스크 드라이버는 모두 이 기능을 사용한다. Linux나 기타 오픈소스 운영체제는 실질적으로 이러한 제한이 없기 때문에3 커널이 PAE를 지원하기만 하면 32bit에서도 64GB4까지 사용할 수 있다.

 

 실질적으로는 저렇게 남는 공간을 시스템 메모리와 비슷하게 활용하는 방안이 있다. 미사용 영역에 램디스크를 만든 뒤에 페이지 파일을 그 램디스크에 올려놓는 방법이다. 안정성 등을 따졌을 때 권장할 수 있는 방법은 아니지만, 하드디스크에 페이지 파일을 둘 때와는 비교하는 것이 어리석은 행위가 될 수준으로 빨라지는 것을 볼 수 있다. 그렇지만 이렇게 하더라도 물리적인 메모리의 한계는 벗어나지 못하므로, 8GB 이상의 메모리를 장착할 생각이라면 64bit 운영체제를 설치하는 것이 바람직할 것이다.

 

※ 2013-10-28 10:15 수정사항 : 그림 추가.

각주 1

http://en.wikipedia.org/wiki/Physical_Address_Extension

각주 2

공식적으로 4GB를 초과하는 메모리를 지원하는 32bit Windows에는 해당되지 않는다. 대표적인 예로 Windows Server 2003의 상위 제품군이 있다.

각주 3

컴파일 옵션에서 PAE 지원을 켜면 드라이버가 모두 이에 맞게 새로 컴파일된다. 이와 다르게 Windows에서 제공되는 드라이버는 기본적으로 소스를 공개하지 않으므로 사용자의 요구에 맞게 재컴파일을 할 수가 없다.

각주 4

물론 64GB를 완전히 채우게 되면 PCI hole에 배당된 크기만큼은 배정되는 주소가 사용할 수 있는 주소 범위를 초과하기 때문에 사용할 수 없다.

  1. http://en.wikipedia.org/wiki/Physical_Address_Extension [본문으로]
  2. 공식적으로 4GB를 초과하는 메모리를 지원하는 32bit Windows에는 해당되지 않는다. 대표적인 예로 Windows Server 2003의 상위 제품군이 있다. [본문으로]
  3. 컴파일 옵션에서 PAE 지원을 켜면 드라이버가 모두 이에 맞게 새로 컴파일된다. 이와 다르게 Windows에서 제공되는 드라이버는 기본적으로 소스를 공개하지 않으므로 사용자의 요구에 맞게 재컴파일을 할 수가 없다. [본문으로]
  4. 물론 64GB를 완전히 채우게 되면 PCI hole에 배당된 크기만큼은 배정되는 주소가 사용할 수 있는 주소 범위를 초과하기 때문에 사용할 수 없다. [본문으로]