Sunday 7 November 2010

x86 vs x64

x86 과 x64의 차이점


응용 프로그램을 코딩하다보면 많이 등장하는 것이 이 x86과 x64이다.

시스템 프로그래밍을 하지 않는다면, Visual Studio 혹은 OS 단에서 대충 잘돌리기 때문에, 위 두 개의 차이점에 대해서 그다지 생각할 필요가 없다.

하지만, 윈도우 내부적인 연산이라던가, 시스템 메시지등을 가져오는 코딩을 한다면 x86과 x64에 대해서 심각하게 고려를 해야한다.

한 가지 예를 들자면, x86으로 DLL을 구성한다면, Windows 7 64bit에서는 후킹을 할 수 없다. 후킹 인젝션하는 Dll이 64bit OS에 인젝션 되지 않기 때문이다. (정확히 말하면, 인젝션은 되나, 일부 기능이 작동하지 않아서, 인젝션 되지 않는 것과 같은 느낌을 들게 한다.)

Windows 7 64bit에 대한 후킹 얘기는 다음으로 미루고, 오늘은 x86과 x64의 차이점에 대해서 간단하게....


x86, x64는 원래 하드웨어에서 나온 말이다. x86용 OS, x64용 OS 등과 같이 쓰이듯이 하드웨어에 맞는 소프트웨어 등 기타를 구성하기 위해서 쓰였다고 생각하면 된다.

좀더 쉽게 생각하면, 286, 386, 486 등과 같은 고전 컴퓨터에서 사용하던 하드웨어 방식이 x86이다. x에 2,3,4 등이 들어간다고 생각하면 된다. 따라서 고전 컴퓨터가 쓰일 당시에는 32bit의 주소방식으로도 얼마든지 프로그램 구성이 가능했고, CPU와 메모리 사이에서 발생하는 통신시에 주소를 32bit만으로도 얼마든지 가능했다. (x86시에는 32bit 주소체계를 이용하였음)

문제는 메모리가 커지다보니, 32bit 주소 체계만으로는 2기가 이상의 메모리(2에 32 = 약 2GB)에 접근이 불가능해졌다.

그래서, 대용량의 메모리를 사용하려다보니 64bit 주소 체계가 필요하게 되었고, 그에 따라서 응용 프로그램에서 파생되는 기타등등의 문제들이 발생하게 되었다.

기본적으론 x86에서 구동되는 프로그램은 x64에서 구동될 가능성도 있고, 구동되지 않을 가능성도 있다. 메모리연산 구조의 차이에 따라서, 구동된다면, 감사고, 아니면 오류다. OS 단에서 x86의 프로그램을 x64로 변환을 시도해주기는 하지만, 그다지 안정적이지도 않고, 수시로 다운이 나버리는 사태가 발생한다.

어찌됐건, x86과 x64사이에서의 호환문제는 사실 해결하기 힘들다. 새로 코딩한다던가, 재빌드를 한다던가 등의 작업을 해줘야함.

어쨋건, x84는 32bit 운영체제에서 구동되는 하드웨어 혹은 그 환경을 말하고, x64는 64bit 운영체제에서 구동되는 하드웨어 혹은 그 환경을 말한다. 별차이는 없지만... 시스템 프로그래밍할 때는 이 두가지 차이 때문에 큰 어려움을 겪을 때가 많다.



추가로 몇가지 덧붙이자면,

x86으로 생성된 프로그램은 x64와 호환되지 않는다. 특히 C++ 코딩에서는 심각한 문제가 발생한다.

x86으로 Dll을 생성하고 x64에서 Dll을 불러오게 되는 경우, add referece를 통해서 로딩하게 되면, badImage Exception 뭐 이딴게 발생한다. 강제적으로 add referece를 하지 않고, Dll 로딩을 하게 된다면, 뭐 구동은 되겠지만, 어느 시점에 이분이 사망하실지 모른다.

특히, C#과 C++의 Dll 모듈 연동시에 위 사항은 크리티컬하다. 나름 꼼수를 써봤지만... 그다지 추천하지는 않는다. 한가지 플랫폼만을 위한 개발을 하는게... 안정적이다. 괜히 이것저것해서 프로그램을 다운시키지나 말았으면 한다.

No comments: