64비트와 32비트 구분
CPU는 I/O버스를 통해 외부로 데이터를 전송하거나, CPU 내부로 수신한다.
데이터를 송수시한 할때 한번에 전송 및 수신할 수 있는 데이터의 크기에 따라 32비트 시스템과 64비트 시스템이 나뉘게 된다. 즉, CPU가 버스를 통해 한번에 송신 및 수신 할 수 있는 크기가 32비트면 32비트 컴퓨터이고, 64비트면 64비트 컴퓨터가 된다.
또다른 기준은 데이터 처리 능력(CPU)이다. CPU는 외부에서 들어오는 데이터를 처리해야 하는데, 32비트 컴퓨터는 한번에 32비트 데이터를, 64비트 컴퓨터는 한번에 64비트 데이터를 처리할 수 있다.
프로그래머 입장에서의 64비트 컴퓨터
표현할 수 있는 주소값의 크기가 클수록 좋다. 메모리 공간만 충분하다면 주소값의 범위가 넓을수록 더 많은 공간을 사용할 수 있기 때문이다. 32비트 컴퓨터에서는 32비트 포인터를, 64비트 컴퓨터에서는 64비트 포인터를 사용하는 것이 가장 좋다.
4비트를 주소값을 표현하기 위해 사용한다는 것은 0000부터 1111까지의 16개의 주소를 표현할 수 있다는 것이다. 즉 많은 비트 수를 활용하여 주소를 표현할 수록, 표현할 수 있는 주소의 범위는 더 넓어진다. 표현할 수 있는 주소의 범위가 넓어지면, 그만큼 활용할 수 있는 메모리 크기도 커진다.
프로그램 구현 관점에서의 WIN32 vs WIN64
64비트 컴퓨터에서의 자료형 표현
운영체제 모델 char short int long 포인터
windows LLP64 1바이트 2바이트 4바이트 4바이트 8바이트
UNIX LP64 1바이트 2바이트 4바이트 8바이트 8바이트
Windows에서는 LLP64데이터표현 모델을 따르는데 int와 long 모두 4바이트 표현하고 포인터만 8바이트로 표현하는 방식이다. 이는 32비트 시스템과의 호환성을 중시한 모델이다.
64비트와 32비트 공존의 문제점
ex) LLP64기반
#include
int main(void)
{
int arr[10] = {0, };
int arrVal = (int)arr; <-데이터 손실 발생
printf("pointer : %d \n",arrVal);
return 0;
}
위 코드는 32비트 시스템에서는 전혀 문제가 되지 않는다. int형과 포인터 모두 4바이트로 표현되기 때문이다. 그러나 64비트 시스템에서는 문제가 된다. int형 포인터 arr은 8바이트인데 이것을 int형 변환을 시도하기 때문이다. 64비트 시스템에서는 포인터를 int, long등 4바이트 정수형으로 변환해서는 안된다.
64비트 windows 시스템에서는 LLP64가 기본 모델이므로 int는 4바이트, 주소값인 포인터는 8바이트로 표현된다. 때문에 위 예제는 형 변환 과정에서 데이터 손실이 발생할 수 있다. 64비트 windows시스템은 16테라(1024 X 16G바이트)바이트의 메모리 공간을 활용할 수 있도록 디자인 되었다. 따라서 배열 arr이 4G 이하의 메모리 영역에 할당되어 4바이트로 주소값 표현이 가능하다면 데이터 손실은 발생하지 않는다.
Ploymorphic 자료형
WIN64 기반으로 넘어가면서 Ploymophic 자료형을 정의한다.
Ploymorphic 단어는 "다양한 모습이 있는" 또는 "다형적"이라는 뜻으로 해석된다. 자료형이 다형적이라는 것은 상황과 환경에 따라서 그 자료형이 의미하는 바가 유동적이라는 뜻이다.
Ploymorphic 자료형 정의
#if define (__WIN64)
typedef __int64 LONG_PTR;
typedef unsigned __int64 ULONG_PTR;
typedef __int64 INT_PTR;
typedef unsigned __int64 UINT_PTR;
#else
typedef long LONG_PTR;
typedef unsinged __int64 UINT_PTR;
typedef int INT_PTR;
typedef unsigned int UINT_PTR;
#endif
-----매크로 _WIN64는 64비트 기반으로 프로젝트 구성 시 자동으로 삽입되는 매크로이다. 마찬가지로 32비트 기반으 로 프로그램 구성 시 매크로 _WIN32가 자동으로 삽입된다. 이 매크로는 조건부 컴파일 및 실행의 기준이 된다.
위 변수들에 PTR이라는 이름이 붙은 이유는 포인터 자료형이 아니라 포인터값 기반의 산술연산을 위해 정의된 자료형이기 때문에 PTR이라는 이름이 붙는다.
Ploymorphic자료형은 시스템 함수의 32비트, 64비트간 호환성을 높이기 위한 방법으로 사용된 것이다.
오류의 확인
GetLastError 함수와 에러코드
Windows 시스템 함수를 호출하는 과정에서 오류가 발생하면, GetLastError 함수 호출을 통해 오류의 원인을 확인할 수 있다. 오류가 발생했을 때, 이어서 바로 GetLastError 함수를 호출하면 오류원인에 해당하는 에러코드를 얻을 수 있다.
GetLastError함수
DWORD GetLastError(void);
GetLastError 함수를 통한 오류확인은 오류가 발생한 직후에 바로 해야한다. Windows 시스템 함수가 호출될 때마다 GetLastError 함수가 반환하는 에러코드는 갱신된다.
'Programming > Windows System Programming' 카테고리의 다른 글
LOAD & STORE 명령어 디자인 (0) | 2020.05.27 |
---|---|
컴퓨터 구조의 접근방법 (0) | 2020.05.25 |
MBCS WBCS(유니코드) 동시지원 (0) | 2019.08.11 |
아스키 코드, 유니코드 (0) | 2019.08.11 |
버스(Bus) 시스템 (0) | 2019.08.07 |