Sankim's Blog

상킴의 블로그 입니다, Sankim@Cloud.Infrastructure.TechnicalConsultant.CSS.Microsoft.Korea Sang Wok Kim

4GB 제한의 진실, 32비트 Windows (XP, Vista, 7)클라이언트

4GB 제한의 진실, 32비트 Windows (XP, Vista, 7)클라이언트

  • Comments 82
  • Likes

지난 ‘Windows 메모리 FAQ’에서 Windows 메모리에 대한 이야기를 드렸는데요, 특히 Windows 클라이언트의 4GB 제한에 대해서 여러분들의 아주 뜨거운(?) 반응이 있었습니다. 그래서 지난 번에 약속 드린 ‘Easy Transfer를 이용한 마이그레이션’은 다음 포스팅으로 미루고 오늘은 ‘4GB 제한의 진실, 32비트 Windows 클라이언트‘라는 주제로 Q&A 형식으로 이야기를 나누도록 하겠습니다.

 

Q1) 왜 Windows 클라이언트는 4GB까지만 지원하나요?

1. Windows XP가 처음 출시된 초기만 해도 4 기가 바이트(GB) 메모리라는 게 서버에서도 거의 사용되지 않는 고사양의 메모리였으므로 4GB를 이상 지원을 고려할 필요가 없었습니다. (당시는 일반적으로 사용하는 서버의 메모리가 512MB 혹은 그 이하였던 시절 이였습니다, 64MB 서버도… ^^)

2. Windows XP SP2가 출시될 시점에 윈도우 클라이언트도 4GB 메모리 필요성의 조짐이 보였습니다, 그래서 당시 Windows 개발팀에서는 윈도우 클라이언트에서 4GB 이상 메모리 지원을 검토하였습니다.

3. 그런데 윈도우 클라이언트에서 4GB 이상의 메모리를 관리(Memory Management)하면 블루스크린(Crash), 시스템 행(System Hang), 부팅이 되지 않거나 혹은 비디오 카드 같은 장치의 드라이버 문제로 장치를 인식하지 못하는 문제가 빈번하게 발생하는 것을 볼 수 있었습니다. (대부분 Memory corruption)

4. 원인은 윈도우 클라이언트를 위해 만들어진 3'rd Party 디바이스 장치 드라이버(Driver)가 4GB 이상 메모리 환경을 고려하지 않고 만들어졌기 때문에 발생한 문제였습니다.

5. 이런 장치 드라이버 호환성 문제를 피하기 위해 윈도우 클라이언트(XP, Vista, 7)에서는 4GB까지만 메모리 관리(Memory Management)를 할 수 있도록 한 것 입니다.

 

Q2) 4GB메모리가 전부 보이지(인식)되지 않고 3(.xx)GB 정도로 보여요, 왜 그런가요?

아래 그림은 제 Windows 7에서 시스템 정보(msinfo32.exe)를 실행시켜 얻을 결과입니다, 실제 설치된 메모리는 4GB지만 윈도우가 이용할 수 있는 실제 메모리는 3GB로 인식하고 있습니다.

clip_image002

하나 더 아래 그림은 작업 관리자에서 나타난 값입니다, 마찬가지로 실제 메모리를 3GB 정도만 인식하고 있는 것을 볼 수 있습니다.

clip_image004

결론부터 말씀 드리면 이 현상의 원인은 컴퓨터의 칩셋(Chipset)과 연결된 장치(비디오 카드, Lan 카드 같은)가 가지고 있는 메모리 때문에 실제 장착된 메모리보다 적게 나타나는 것입니다. 윈도우는 '실제 메모리'에 나타난 '전체' 크기 만큼의 메모리만 사용할 수 있므며(즉 위와 같은 경우에는 전체 4GB를 사용하지 못합니다) 이는 하드웨어 이슈 입니다. 이와 연관있는 디바이스 요소로는 System BIOS, Motherboard Resources (I/OxAPIC), Memory Mapped I/O, PCI Express Configuration Space, Additional PCI Device Memory (Graphics Aperture), VGA Memory 등이 있습니다.

[이유는 아래와 같습니다]

어려운 이야기가 될 수 있으니 쉬운 이해를 위해 먼저 아래 그림을 보시죠. 시스템이 시작할 때 Physical Address Map(이하 PAM)이라는 걸 만듭니다, PAM은 RAM과 각 장치들이 가지고 있는 메모리의 주소 정보로 일종의 '순서' 혹은 '차례'를 만들어 Windows에게 넘겨줍니다, 그러면 Windows는 PAM  범위의 메모리만 사용(Access) 할 수 있습니다.

그런데 PAM이 만들어 질때 메모리(RAM)만 가지고 만드는 것이 아니고 모든 종류의 장치가 가진 디바이스 메모리(비디오 카드, Lan 카드가 가지고 잇는 메모리를 칭함)까지 포함합니다, 처음에는 RAM만 가지고 PAM을 만들어 가다는 중간에 디바이스 메모리가 끼어들게 됩니다, 그러면 PAM 중간에 디바이스 메모리가 포함되고 다시 PAM에 추가되다만 나머지 RAMPAM에 추가 되는데 이때 추가된 RAM이 4GB 범위 밖에서 만들어집니다. x86 Standard Memory management Mode를 사용하는 32-bit Windows는 4GB 메모리 영역까지만 사용(Access) 할 수 있는데 디바이스 메모리 때문에 RAM이 4GB 범위 밖으로 밀려나 해당 범위의 메모리가 보이지 않게 되는  것입니다.

clip_image006

위 그림은 총 4GB메모리 환경에서 디바이스 메모리가 총 500MB이기 때문에 사용할 수 있는 총 메모리가 3.5GB로 줄어든 예입니다. 밀려난 500MB는 윈도우가 Access 할 수 없는 영역이기 때문에 사용할 수 없습니다. 이 이슈는 하드웨어에서 해결해야 할 이슈입니다. (이전에 사용한 '문제'라는 표현은 오해를 가져 올수 있어 '이슈'로 변경하였습니다, 여기서 하드웨어란 칩셋을 의미합니다 )

*참고로 32비트 Windows 서버 관련한 4GB 제한에 대한 이야기는 이전에 ‘누가 내 메모리를 훔쳤나?’라는 글로 포스팅한 적이 있습니다, 서버에 관심 있으신 분들은 참고로 읽어 보시기 바랍니다.

 

Q3) 정말 디바이스 장치들이 메모리 중간에 끼어 들어 메모리가 밀려났는지를 어떻게 해야 볼 수 있죠?

이전에 어떻게 해야 볼 수 있을까 고민 많이 했는데(디버거 봐야 하나.. 등등 ^^;) 의외로 장치 관리자(devmgmt.msc)에서 간단하게 보실 수 있었습니다. 아래 내용은 32비트 클라이언트뿐만 아니라 64비트와의 비교를 보여드리기 위해 제 테스트 머신에 듀얼 부팅으로 Windows Vista 32비트와 64비트를 설치해 테스트를 진행하였습니다.

32 비트 Windows 클라이언트

아래 그림은 32비트 Vista 작업 관리자(taskmgr.exe)에서 보이는 Physical Memory의 모습입니다, 4GB를 장착했지만 전체가 3.3GB정도가 나옵니다.

clip_image008

그렇다면 ‘작업 관리자’가 말하는 Windows가 실제 인식한 Physical Memory 범위는 어떤 모습일까요? 아래 그림은 Meminfo.exe를 이용하여 Windows가 실제 인식하는 Physical Memory 범위를 출력한 결과입니다. (meminfo는 전에 소개해 드렸던 Windows Internals 5’th Edition을 쓴 Alex Ionescu가 만들었습니다)

clip_image010

메모리를 표기할 때 16진수로 표현하고 이를 00000000~FFFFFFFF로(0MB에서 4GB)로 표현합니다. 위 결과를 보시면 Physical Memory 범위가 ‘00001000~0009F000’과 ‘00100000~CFDFF000’ 두 범위로 나눠져 있으며 대략 3.4GB 정도의 크기 입니다.

그럼 두 범위에 중간에 빠진 ‘0009F000~00100000’과’CFDFF000~FFFFFFFF’ 사이 영역은 왜 Windows에서 인식하지 못한 것 일까요? 앞에서 말씀 드렸듯이 디바이스가 해당 영역을 점유해 윈도우가 사용(Access)할 수 있는 메모리가 아니기 때문입니다.

디바이스가 점유한 모습은 ‘장치 관리자(devmgmt.msc)’를 통해 확인 하실 수 있습니다, ‘장치 관리자(devmgmt.msn) > 보기 > 리소스(연결별) > 메모리’를 선택합니다, 그러면 아래 그림과 같이 비디오 카드 Radeon X13000이 ‘D0000000~DFFFFFFF’(대략 268MB)과 ‘FE900000~FEAFFFFF’(대략 2MB) 영역, 즉 Physical Memory 범위에서 제외되었던 곳에 자리 잡고 있음을 확인 할 수 있습니다.

clip_image012

32비트에서는 4GB에서 밀려난 메모리를 볼 수 없습니다, 그럼 밀려난 나머지를 보기 위해 우리 64비트를 살펴보도록 하죠~

64비트 Windows 클라이언트

아래는 64비트 Vista 작업 관리자(taskmgr.exe)에서 보이는 Physical Memory의 모습입니다, 4GB 모두 보입니다.

clip_image014

Meminfo로 본 Physical Memory 범위입니다, 64비트라 Address 범위부터가 다르죠? Memory Address가 4GB를 넘고 메모리 또한 4GB 범위 모두 나타납니다.

clip_image016

장치 관리자에서 본 모습입니다.

clip_image018

32비트에서 본 것과 마찬가지로 위 빨간 박스의 부분은 268MB정도 되고 아래가 2MB정도가 됩니다. 중간에 비디오 카드가 끼어 들었지만  4GB 이후 주소인 '0000000100000000~000000012C000000(실제 메모리 5GB 쯤의 자리)'에서 나머지 720896KB(대략 720MB)를 인식한 것을 볼 수 있습니다. 즉 디바이스가 메모리를 4GB 영역 밖으로 밀어냈다고 해도 128GB까지 인식하는 64bit Addressing 때문에 문제없이 모든 Physical Memory가 보입니다.

처음에 드렸던 예로 이런 상황에서 64비트를 그림으로 표현 하면 아래와 같습니다.

image

 

Q4) 그럼 32비트 클라이언트가 4GB 이상을 사용(Access, Addressing)하려면 어떻게 해야 할까요?

정답은 32비트 클라이언트는 4GB 이상을 사용할 수 있는 방법이 없습니다, 4GB 이상 메모리의 사용이 필요하다면 64-bit Windows 클라이언트를 사용하십시오.

현재는 32-bit 환경에서 64-bit 환경으로 넘어가기 위해서는 우선 64비트로의 인식전환이 필요할 것입니다. 다음으로 64비트 전용 응용프로그램들이 많이 나와야 할 것 입니다, 32비트 응용프로그램을 에뮬레이션 하기 위한 WOW 64 Subsystem이 있기는 하지만 모든 응용프로그램에 호환성을 보장하지 않고 32비트 응용프로그램 구조상 64비트 Windows에서 실핼 할 때 64비트가 제공하는 무한(?)한 메모리를 이용할 수 없는 제한이 있습니다.

*64비트 윈도우와 응용프로그램에 대한 이야기는 예전에 포스팅 한 글이 있습니다, 읽어 보시고 추가적인 이해에 도움이 되셨으면 합니다.

Windows 64bit Computing에 대한 오해 혹은 잘못된 상식
http://blogs.technet.com/sankim/archive/2007/12/28/windows-64bit-computing.aspx

 

Q5) Windows XP를 보면 PAE를 지원하는데 이는 XP도 PAE를 사용하면 4GB 이상을 사용할 수 있다는 의미 아닌가요?

Windows XP SP2 부터 나온 DEP(Data Execution Prevention)를 사용하기 위해서는 기본적으로 PAE가 활성화(Enable)되어 있어야 합니다, 그래서 PAE 기능을 활성화 할 수 있도록 한 것입니다. 이는 Windows Kernel에서 32bit에서는 존재하지 않는 64bit PTE table의 field를 이용하기 때문입니다.

To use these processor features, the processor must be running in Physical Address Extension (PAE) mode. However, Windows will automatically enable PAE mode to support DEP. *해당 문서를 보시려면 여기를 클릭하세요.

참고로 PAE를 활성화 하는 경우와 반대의 경우 윈도우가 시작 시 로드하는 커널 파일은 아래와 같습니다.

CPU 수에 따른 환경

기본

PAE 활성

Uniprocess(단일 CPU)

Ntoskrnl.exe

Ntkrnlpa.exe

Multiprocess(다중 or 코어 CPU)

Ntkrnlmp.exe

Ntkrpamp.exe

 

Q6) 번 외 질문인데요, 도구마다 메모리 측정 결과가 각기 조금씩 다른 경우가 있어요 왜 그렇죠?

위 그림에서 작업관리자는 3.3인데 왜 meminfo는 3.4냐고 반문하실 수도 있습니다 또한 제가 종종 받는 질문 중 하나가 작업 관리자에서 ‘사용가능’ 항목과 성능 모니터에서 ‘Available %메모리%’의 값이 다르다는 것입니다. 이는 각 도구마다 메모리를 계산하기 위한 항목 수집 기준이 조금씩 달라서입니다, 크게 차이가 나는 것이 아니므로 이번 포스팅에서는 무시하셔도 좋습니다. 언제 작업 관리자에 나온 항목에 대한 자세한 설명을 드리겠습니다. (약속만 드리고 지키지 못하는 것들이 많지만 이번 약속은 !!)

그럼 여러분 좋은 하루 되세요~

* 이전에 댓글에 추가로 명시 했습니다만 '장치 메모리', 혹은 'MMIO'라고만 명시 한것에 대해서 모호하다는 의견이 있어 본문 내용과 하단 부분에 함께 추가 합니다. ^^ 4GB 전체 사용하지 못하는 이슈에 영향을 끼치는 디바이스 요인으로 System BIOS, Motherboard Resources (I/OxAPIC), Memory Mapped I/O, PCI Express Configuration Space, Additional PCI Device Memory (Graphics Aperture), VGA Memory *등(헥헥헥..)이 있습니다. 그러나 말씀안드려도 이들 모두 '장치 메모리'의 범주 임을 알 수 있는 센스~!

 

[참고자료]
Pushing the Limits of Windows: Physical Memory, Written by Mark Russinovich *이번 포스팅의 대부분의 아이디어가 이 글에서 나왔습니다, 꼭 한번 읽어 보시기 바랍니다.
Windows Internals, Chapter 7 Memory Management
Intel 64 and IA-32 Architectures Software Developer’s Manual, Intel 64 and IA-32 Architectures

Comments
  • PingBack from http://blogs.technet.com/sankim/archive/2009/05/11/faq.aspx

  • 역시 실력으로 응수 하셨군요. 배우기라는분이 올린 여러글들을 읽어 보았습니다, 혼자 독학하면서 상당히 많은 부분 잘못 이해하고 글을 쓴것 같네요 그글을 많은사람들이 읽어볼텐데 걱정입니다. 앞으로도 등불같은 블로그가 되어주세요.

  • PCI 메모리에 디바이스 드라이버가 올라가는 것 아니였나요?

  • 안녕하세요? :)

    디바이스 드라이버는 Windows가 Access할 수 있고 관리(Memory Management) 가능한 물리 메모리에 올라 갑니다(PCI 메모리에는 올라갈 수 없습니다), 윈도우 Virtual Address Space에서 System Space 공간에 올라 갑니다. Windows Internals에서 Memory Managemnet를 참조해 주세요. 그리고 윈도우 MM을 이해하시려면 Windows Internals과 함께 Intel Processor를 이해 하셔야 합니다. *Intel 메뉴얼 3A의 Chapter 3/ Protected-Mode Memory Management를 참조하십시오.

    감사합니다.

  • 부용님, 치즈 김밥님 올려주신 댓글 잘보았습니다. :)

    좋은 하루 되세요~

  • Catts님// 말씀 감사합니다, 그 사실(?) 알고 있었어요 :) 즐거운 하루 되세요~

  • 허허.. 참.. 어의 없네요..

    http://www.ebuzz.co.kr/content/buzz_view.html?ps_ccid=80663

  • 제 글과 비슷하다는 의미시지요? 기술 이야기는 비슷할 수도 있다고 생각합니다... 저도 Mark Rusinovich의 글을 뼈대로 했으므로 나쁘게 생각하지는 않습니다만 몇가지 오류가 눈에 걸리네요.

    그중에 가장 큰것이 글쓰신 분께서 Virtual Address와 Physical Address를 혼돈하고 계신듯 합니다, 둘은 전혀 다른 의미 입니다. virtual Address는 Process가 사용하기 위한 가상의 메모리 공간을 이야기 하고 Physical Address는 시스템에서 사용하는 실제 메모리 공간(칩셋이 알려준)을 의미 합니다. Virtual Address와 Physical Address를 혼돈한다면 상당히 어렵습니다.

    그리고 4GB 전체 사용하지 못하는 이슈에 영향을 끼치는 디바이스 요인으로 MMIO 뿐만 아니라 System BIOS, Motherboard Resources (I/OxAPIC), Memory Mapped I/O, PCI Express* Configuration Space, Additional PCI Device Memory (Graphics Aperture), VGA Memory등이 있습니다.

    이 포스팅을 쓸때 더 자세한걸 쓰려다가 너무 깊어질것 같아 이 정도(?)까지 썼는데 나중에 시간 나면 이부분도 더 소개해 드리도록 하겠습니다. :)

    그리고 /userva는 Exchange Server와 같이 이 옵션을 Aware하는 어플리케이션에서 적용 해야 합니다. 그렇지 않은 경우에는 의미가 없으며, 메모리에 민감(?)한 응용프로그램은 동작자체를 하지 못하는 경우가 있을 수 있습니다(이 일로 Troubleshooting을 한 경험이 있습니다) 또한 /3GB로 인해 PTE Leak 이슈가 나타날 수 있습니다, 해당 글에서 언급한 ‘/3GB /userva' 옵션을 사용해도 문제는 마찬가지 입니다.

    이 이슈를 정확히 이해하려면 Windows Kernel 뿐만 아니라 Processor도 이해하고 있어야 합니다. 이 이슈를 자꾸 하드웨어의 여러 기술에 접합시켜 이해하려면 더 복잡해지고 엉뚱한 답이 나올수 있으므로 지양해야 합니다.

  • 어제 저녁에 읽어 보고 링크의 글 내용중 몇가지에 대해서..

    '이 기술을 적용하면 32비트 윈도의 메모리 한계를 최대 64GB까지 확장한다.'

    => 정확하게는 32비트 Addressing을 36비트로 변환하여 64GB까지 액세스 메모리 영역을 확장합니다. 이 구조하에 Windows에서는 PTE의 Size를 확장하여 64GB Physical Memory에 액세스가 가능하도록 구현합니다.

    '4GB란 용량은 앞서 말한 것처럼 물리 메모리가 아니라 주소 공간을 뜻한다. 이 4GB의 가상 공간을 2개로 쪼개 2GB는 커널 모드, 나머지 2GB를 유저 모드에 할당한다.'

    =>  여기서 주소 공간이 바로 앞에서 설명 드린 Virtual Address Space 입니다.

    '꼼수를 이용해 4GB 이상의 메모리를 쓴다?'

    => PE모드에서 변경했다는 것 같은데.. 정확히 이부분은 어떻게 한것인지 궁금하네요, 방법을 아시는분 계시면 저에게 알려주시면 감사하겠습니다.

    **그리고 이 포스트를 쓸 때 MMIO가 할당 되는 부분은 써야 할지 말아야 할지 고민했었습니만 이 부분은 하드웨어(정확히 말하면 Chipset)에서 다뤄야 할 사항이므로 자세한 내용 설명 없이 넘어갔었습니다(이것까지 쓰면 참 길어지죠). 혹시 이 부분을 확인 하기 위해 몇 대 컴퓨터에서 테스트 하시는 분들이 계시다면(왜곡 될수 있는 답을 얻을 가능성 높음) 그것 보다는 Intel Processor Manual을 구해 보시기를 추천해 드립니다, 이 모든 구조가 바로 Processor와 Chipset과 관련이 있습니다. 참고로 Intel Manual은 Intel 홈페이지에서 무료로 PDF로 제공 됩니다, 얼마전까지 책을 무료로 배송해 줬던걸로 아는데 어딘지 기억이.. . ^^;

  • 32비트 클라이언트에서는 4GB를 전부 사용하는 방법은 없나요?

  • 네, 하드웨어에서 Physical Memory를 4GB로 보여 주지 않는한 Memory addressing이 불가능 합니다.

  • 정말 멋진 포스팅 감사합니다

    메모리를 4GB로 올리며 향간에 들리는 소문따라 진상을 파악하고자 찾아다녔는데...

    이 포스팅을 통해 확실히 이해했습니다.

    다시 한번 감사합니다^^  (--)(__)

  • 이런 말씀들으면 힘이 불끈 불끈!!

    감사합니다 :)

  • 4GB에서 제한이 걸린것은 32비트 환경이기 때문입니다.

    2^32 = 4294967296Bytes = 4.0GB

    4GB이상의 메모리를 사용하지 않아서 제한을 건것이 아니고 32비트의 구조상 한계때문에 자연스럽게 4GB로 제한이 걸린것이며 만약 구조한계를 해결할 수 있었다면 64비트 운영체제를 만들 필요는 없었습니다.(사실 서버 버전에서는 메모리 관리 부분에만 비트수를 늘리긴 했지만 어디까지나 서버이기 때문에 가능한 것일겁니다..)

    드라이버 문제는 쉽게 해결 가능했을겁니다.

    윈도 버전이 바뀔때마다 새로 드라이버를 만들어야 했고, 서비스팩 2 출시때부터 4GB 이상 메모리지원을 할 생각이 있었다면, 윈도 비스타때부터 4GB이상 메모리 지원 드라이버를 개발하도록 제조사에 권유해 크래시등의 문제는 생기지 않았겠지요.

    주절주절 쓰다보니 말이 길어졌네요.^^

  • 안녕하세요?

    말씀하신 클라이언트/서버 4GB제한의 차이는 '클라이언트'와 '서버'의 컨셉의 차이로 이해 하셔야 합니다. 서버이기 때문에 가능하다는 생각은 잘못된 생각입니다.

    32비트 한계로 인한 4GB 제한은 CPU의 PAE를 통해 해결되어 128GB까지 가능합니다, 이는 CPU로 인해 가능해진 것이지 서버 제품이기 때문에 4GB이상 ACCESS가 가능한것이 아닙니다. PAE라는 것이 바로 36bit Addressing입니다.

    그리고 64Bit 환경은 앞으로 근미래에 어떻게 변할지 모르겠지만 현재는 Enterprise Server를 위함이라고 보시는 것이 맞습니다, 아무리 32bit를 PAE로 확장한다고 해도 64bit의 1테라바이트의 메모리를 가지는 것은 불가능 하기 때문입니다. 1테라를 가지는 시스템을 예로들면 대형 DBMS를 구동하기 위함입니다.

    그리고 드라이버 문제는 생각하시는 것 처럼 *절대* *쉽게* 해결 할 수 있는 것이 아닙니다. 단순히 서버 장비용 디바이스가 좋은 좋은 부품(?)이나 구조(?) 혹은 서버용이라고 이름 붙였다고 몇배 이상 비싼것이 아닙니다.

    감사합니다.

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment