Wow64에 대해서

예전에는 서버용 운영체제에서만 사용되던 64bit 컴퓨팅 환경이 최근에는 CPU 기술의 발달로 개인용 컴퓨터에도 보편화된 추세입니다. 32bit 환경에서는 Intel사가 독보적인 존재였지만, 64bit 환경에서는 AMD가 저렴한 가격에 Intel보다 빨리 개인 사용자용 64bit CPU를 상용화해서 출시함에 따라 시장에서 보다 우위를 차지하고 있습니다.

흔히 32bit 운영체제를 Intel CPU의 이름을 따라 ‘x86’ 기반의 플랫폼이라고 합니다. Intel이 먼저 제품을 출시하였고 이에 따라 후발업체인 AMD는 x86에 호환되도록 CPU를 개발하게 되었습니다. 64bit의 경우 AMD가 먼저 상용화하여 제품을 출시하였는데 이를 ‘x64’ 라고 흔히 얘기합니다. 그리고 이후에 출시된 Intel의 64bit 제품군은 ‘IA64’ 라는 이름으로 부릅니다.

32bit 플랫폼에서는 프로세스의 가상메모리로 4G의 영역을 사용할 수 있었습니다. 이는 32bit 플랫폼에서 주소를 가리키는 포인터가 4 byte(32bit)로 표현되기 때문에 표현가능한 주소의 범위가 0~2^32이기 때문입니다. 64bit 플랫폼에서는 포인터의 크기가 8byte로 늘어났기 때문에 프로세스별로 사용가능한 가상메모리의 크기가 크게 늘어났습니다.

하지만 새로운 운영체제를 개발할 때마다 그럼 기존에 개발된 어플리케이션에 대한 하위 호환성도 제공하느냐는 것이 이슈가 됩니다. 사용자들이 업무용이나 개인용으로 사용하고 있던 어플리케이션이 새로운 플랫폼에서 정상 동작하지 않는다면 아무리 새로운 플랫폼이 기술적으로 뛰어나다고 할지라도 새로운 플랫폼으로 이동하는데 장벽이 되기 때문입니다.

64bit 플랫폼에서도 기존에 32bit 용으로 개발된 어플리케이션이 실행될 수 있도록 하는 기능을 제공하고 있는데 이를 ‘Wow64’ 라고 합니다. Wow는 ‘Windows on Windows’를 의미하는 것으로 실제 64bit Windows 상에서 또 다른 32bit Windows가 실행된다는 의미로 일종의 가상 머신(virtual machine) 환경을 제공한다고 이해하시면 됩니다.

image

[그림] Wow64 아키텍쳐

앞서 이미 설명한 바 있지만 기존에 32bit용으로 개발된 어플리케이션을 64bit 플랫폼에서 실행하는데 있어서 가장 큰 문제가 되는 것은 서로 다른 가상주소 체계를 가지고 있다는 것입니다. 기존에 개발된 어플리케이션은 64bit 플랫폼에서 실행되더라도 여전히 4GB의 가상주소 체계를 사용하고 있습니다. 따라서 기존 어플리케이션의 실행을 위해서 32bit 플랫폼을 시뮬레이션 해주는 중간 계층이 필요하게 됩니다. 위 그림에서 우측 점선으로 표시된 박스가 바로 이 역할을 담당합니다.

32bit 어플리케이션에서 user mode 영역에서 가장 하위에 위치한 ntdll.dll은 원래 kernel mode의 시스템 서비스를 호출하기 위한 stub 코드를 제공합니다만, Wow64의 경우에는 32bit ntdll.dll이 kernel code를 실행하기 이전에 이를 Wow64.dll에서 가로채고 64bit 환경에 맞는 주소체계와 적절한 CPU 명령어로 이를 변환한 후에 64bit ntdll.dll로 전달합니다. 이후의 과정은 64bit kernel code에 의해서 실행되고, 이를 다시 어플리케이션으로 반환하기 위해서는 Wow64 모듈에 의해서 다시 32bit 주소체계로 변환되어 전달되는 식으로 동작합니다.

다만 Wow64가 동작하는 데에는 다음과 같은 제약사항이 있습니다.

  • user mode 영역은 기본으로 2GB, /LARGEADDRESSAWARE가 사용된 경우에는 4GB 까지만 사용 가능합니다.
  • 32bit 응용프로그램은 64bit DLL을 로딩할 수 없습니다. (Wow64 관련 모듈은 제외)
    16bit 응용프로그램은 지원하지 않습니다.
  • Virtual DOS Machine(VDM) API는 사용할 수 없습니다.
  • AWE(Address Windowing Extension), scatter/gather I/O, write-tracking 처럼 page size에 종속적인 API들은 Intel Itanium 계열에서 사용할 수 없습니다.
  • PAE(Physical Address Extension) API는 Intel Itanium 계열에서 사용할 수 없습니다.
    DirectX 하드웨어 가속 API들은 Intel Itanium 계열에서 사용할 수 없습니다.