Tag Archives: 64bit programing

64bit 윈도우 프로그래밍

[자료 출처] LinkMemo Blog

zdnet에 안철수연구소의 유병인님이 쓰신 3부작 글을 한눈에 볼 수 있게 요약하여 놓은 글입니다.

[64비트 윈도우 프로그래밍] ① 32비트 프로그램을 엄호하라

64bit x86아키텍처는 32/64bit 겸용 아키텍처, IA64와 같은 64bit 전용 아키텍처로 나뉘며, 이 아키텍처에 따라서 64bit 윈도우의 동작은 틀려진다.


64bit 윈도우의 틀린점
(※이 틀린 점은 64bit 프로세스에서만 지원한다.)
-64개의 CPU를 지원한다.
-8K Page를 사용한다.

x64와 IA64의 틀린점
-x64는 32bit 프로그램을 직접 실행하는데 비하여 IA64는 32bit 에뮬레이션을 하여 실행한다.
-IA64는 AWE(Address Windowing Extention)를 사용할 수 없으며 일부 32bit API를 사용할 수 없는데 반하여 x64는 사용자 메모리를 4G까지 사용할 수 있다.

32bit 프로세스와 64bit 프로세스 사이의 호환성을 위하여 존재하는 기능
API
-현재 받은 메세지가 32bit에서 발생했는지 64bit에서 발생했는지 알 수 있는 API존재, 이는 잘못된 포인터 사용에 의한 버그를 막는다.

Registry
-기본적으로 32bit 영역과 64bit 영역을 가지며 32bit 영역은 32bit 프로세스가 사용하며 64bit 영역은 64bit 프로세스가 사용한다.
-32bit와 64bit 사이에 자동으로 copy가 일어나 sync되는 영역을 가진다.
-32bit와 64bit 사이에 move가 일어나 한 곳에만 존재하는 영역을 가진다.

System File
-시스템 파일에 대한 접근은 기본적으로 OS의 디렉토리 변경에 의하여 64bit 프로세스는 64bit 시스템 파일이 있는 디렉토리를 억세스하게 되어있다. 특정 API를 사용하여 이 기능을 끌 수 있으나 이로인한 잘못된 DLL 로딩은 프로그램을 멈추게 할 수 있다.

COM
-32bit와 64bit 프로세스 사이에서 In-Process COM(DLL)은 호환되지 않으나 Out-Process COM(EXE)은 호환된다.

[64비트 윈도우 프로그래밍] ② 64비트 윈도우 파악하기

64bit 데이터모델

LLP64
int, long형은 32bit형 그대로 인데 비하여 포인터는 64비트인 모델로 소스의 호환성을 높여 32bit 소스를 특별한 수정없이 64bit 윈도우에서 돌아가도록 만든다.

크기가 고정된 일반 데이터형(Fixed Precision)
32bit 윈도우냐 64bit 윈도우냐에 상관없이 크기가 고정된 데이터형

윈도우에 따라 크기가 다른 포인터형(Pointer Precision)
32bit 윈도우에서 실행되냐, 64bit 윈도우에서 실행되냐에 따라서 크기가 달라지는 포인터형

크기가 고정된 포인터 형(Specific Pointer Precision)

데이터간 형변환을 안전하게 도와주는 함수

64bit 주소공간
32bit 윈도우가 4GB의 가상 메모리를 지원하는데 비하여 64bit 윈도우는 16TB까지의 가상 메모리를 지원한다.

32bit 윈도우
4GB를 커널 모드 주소공간 2GB와 사용자 모드 주소공간 2GB를 사용할 수 있으며 /3gb 스위치로 부팅할 시 3GB를 사용할 수 있으며 윈2K이상에서는 AWE(Address Window Extension)기법을 사용하여 4GB 이상의 주소공간을 사용할 수 있다. 일부 윈도우 서버에디션은 최대 64GB의 메모리를 사용할 수 있다.

64bit 윈도우
16TB를 커널 모드 주소공간 8TB와 사용자 모드 주소공간 8TB를 사용할 수 있다.

Win64 API
별도의 Win64 API는 존재하지 않으며 기존의 Win32 API를 사용하면 된다. 단 일부 API와 같은 경우 별도의 권장API가 있다.

struct 변수의 64bit alignment를 고려한 배치 예

[64비트 윈도우 프로그래밍] ③ 64비트 프로그램으로 가는 길
64bit를 지원하지 않는 라이브러리
-DAO(Data Access Object), Jet 데이터베이스

LLP모델 프로그래밍시 주의사항
1. 64bit인 포인터를 32bit인 int, long, UINT, DWORD 타입으로 캐스팅하지 말 것
-> 부득이한 경우, PtrToLong(), PtrToUlong()등의 함수를 사용해야 하며 이 함수에서 조차도 64bit가 32bit로 절단되므로 포인터로 재변경하는 것은 하지 말아야 한다..
2. 32bit형 API나 데이터형을 이용할 수 없다.
-> SetWindowLongPtr와 같은 새로운 윈도우 클래스 함수를 이용해야 한다.
-> 윈도우나 클레스 데이터를 접근할 때 FIELD_OFFSET를 이용해야 한다.
-> LPPARM, WPARAM, LRESULT 타입의 크기가 64bit가 된다.
3. 8byte Alignment에 대한 Padding에 주의해야 한다.

기타참고 자료
Everything You Need To Know To Start Programming 64-Bit Windows Systems
석재현 님의 한글 번역본
조금은 64bit Windows Internal에 포커스를 맞춘 글로서 배경지식으로 참조할 만 합니다.