[스터디] 시스템 프로그래밍 - Chapter 3. 64비트 기반 프로그래밍

2023. 9. 13. 18:15·독서/뇌를 자극하는 윈도우즈 시스템 프로그래밍

뇌를 자극하는 윈도우즈 시스템 프로그래밍(저자, 윤성우)


01. WIN32 vs WIN64

이전까지는 32 Bit 기반의 시스템이 대부분이었으나, 지금은 64 Bit 기반의 시스템이 주류를 이루고 있다. 32 Bit와 64 Bit 시스템은 서로 다른 부분이 존재하기 때문에 두 시스템의 차이에 대해서 살펴보자.

 

- 64 Bit, 32 Bit

한 번에 전송 및 수신할 수 있는 데이터의 크기에 따라서 32 Bit와 64 Bit 시스템이 나뉘게 된다. 32 Bit 데이터를 송·수신한다면 32 Bit 기반 시스템이고 64 Bit 데이터를 송·수신한다면 64 Bit 기반 시스템이다.

 

송·수신할 수 있는 데이터의 크기가 크다면 프로그래머에게는 무척 긍정적인 일이다. 표현할 수 있는 데이터의 범위가 넓기 때문이다. 

 

32 Bit 컴퓨터에서 주소값 표현은 표현 주소가 넓은 범위를 가졌으며 연산 속도고 빠르게 해야 한다고 가정했을 때, 32 Bit 시스템을 사용하는 것이 최선이다. 

 

02. 프로그램 구현 관점에서의 WIN32 vs WIN64

- LLP64 vs LP64

Windows에서는 LLP64라는 데이터 표현 모델을 따르고, int와 long을 4 Byte로 포인터만 8 Byte로 표현한다. 32 Bit 시스템과의 호환성을 중시한 모델이라 볼 수 있다. Unix에서는 LP64 모델을 가지고 있는데 long을 8 Byte로 취급한다는 점이 Windows와 다르다.

 

- 64 Bit와 32 Bit의 공존의 문제점

#include <stdio.h>

int main(void)
{
    int arr[10] = { 0, };
    int arrVal = (int)arr;
    printf("pointer : %d \n", arrVal);
    return 0;
}

위 코드는 32 Bit 시스템에서는 int와 포인터가 각각 4 Byte의 공간을 가지기 때문에 32 Bit 시스템에선 문제가 되지 않는다. 다만, 64 Bit의 Windows 시스템에서는 int가 4 Byte, 포인터가 8 Byte를 가지기 때문에 데이터가 손실되는 문제가 생길 수 있다.

 

- Windows 스타일 자료형

 

- Polymorphic 자료형

MS는 WIN64로 기반으로 넘어가면서 Polymorphic 자료형을 정의하고 있다. Polymorphic이란 단어는 '다양한 모습이 있는' 혹은 '다형적'으로 해석할 수 있다. 상황과 환경에 따라서 자료형은 유동적이란 뜻이다. 자료형의 정의는 아래와 같다.

#if defined(_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 unsigned long ULONG_PTR;
    
    typedef int INT_PTR;
    typedef unsigned int UINT_PTR;
#endif

뒤에 붙은 PTR은 포인터 선언을 뜻하는 것이 아닌, 포인터값 기반의 산술 연산을 위해 정의된 자료형이며, 32 Bit 시스템과 64 Bit 시스템은 서로 포인터의 정밀도가 다르기에 발생하는 문제들을 해결하기 위한 자료형이라는 뜻이다.

 

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

UINT CalDistance(UINT a, UINT b)
{
	return a-b;
}
 
int _tmain(void)
{
	INT val1 = 10;
	INT val2 = 20;
    
	_tprintf(_T("Position %d, %d \n"), (UINT)&val1, (UINT)&val2);
    
	_tprintf(_T("Distance %d \n"), CalDistance((UINT)&val1, (UINT)&val2));
	return 0;
}

위 코드는 32 Bit 기반의 선언된 두 변수의 메모리 공간 거리를 구해준다. 해당 코드를 WIN64 기반에서 동작시켰을 때, 4 Byte로 표현이 불가능한 범위의 주소값이 등장할 수 있으므로 사용할 수 없다. WIN64에서는 아래와 같이 구현되어야 한다.

 

UINT64 CalDistance(UINT64 a, UINT64 b)
{
    return a-b;
}

 

이를 Polymorphic 자료형을 사용하여 변경해보자.

 

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

UINT_PTR CalDistance(UINT_PTR a, UINT_PTR b)
{
    return a-b;
}
 
int _tmain(void)
{
    INT32 val1 = 10;
    INT32 val2 = 20;
    
    _tprintf(
    _T("Distance %d, %d \n"), 
    CalDistance((UINT_PTR))&val1, (UINT_PTR)&val2))
    );
    
    return 0;
}

위 코드에서 UINT_PTR의 메모리 용량은 알 수 없다. Polymorphic 자료형 특성상, 실행환경에 따라 좌우되기 때문이다.

 

03. 오류의 확인

- GetLastError 함수와 에러코드

 Windows 시스템 함수들은 오류 발생 시, NULL을 반환하고 이를 통해서 에러가 발생함을 알 수 있다. 하지만, 에러의 원인까지 반환하지는 않기 때문에 원인을 파악하고자 한다면, 다음에 바로 GetLastError() 함수를 통해 에러의 원인을 확인할 수 있다.

 

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain(void)
{
    HANDLE hFile =
    CreateFile (
      _T("TEST.DAT"), GENERIC_READ, FILE_SHARE_READ,
      NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
      NULL);
      
    if(hFile==INVALID_HANDLE_VALUE)
    {
        _tprintf(_T("error code : %d\n"),GetLastError());
        return 0;
    }
    
  return 0;
}

▶ 실행 결과

error code : 2

※ 주의

오류 확인은 오류가 발생한 직후에 바로 해야 한다. Windows 시스템 함수가 호출될 때마다 GetLastError 함수가 반환하는 값이 갱신되기 때문이다.

 

'독서 > 뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글

[스터디] 시스템 프로그래밍 - Chapter 5. 프로세스의 생성과 소멸  (0) 2023.10.02
[스터디] 시스템 프로그래밍 - Chapter 4. 컴퓨터 구조에 대한 두 번째 이야기  (1) 2023.09.19
[스터디] 시스템 프로그래밍 - Chapter 2. 아스키코드 vs 유니코드  (1) 2023.09.11
[스터디] 시스템 프로그래밍 - Chapter 1. 컴퓨터 구조에 대한 첫 번째 이야기  (1) 2023.09.11
[스터디] 시스템 프로그래밍 - 0  (0) 2023.09.11
'독서/뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
  • [스터디] 시스템 프로그래밍 - Chapter 5. 프로세스의 생성과 소멸
  • [스터디] 시스템 프로그래밍 - Chapter 4. 컴퓨터 구조에 대한 두 번째 이야기
  • [스터디] 시스템 프로그래밍 - Chapter 2. 아스키코드 vs 유니코드
  • [스터디] 시스템 프로그래밍 - Chapter 1. 컴퓨터 구조에 대한 첫 번째 이야기
태역
태역
  • 태역
    RYULAB
    태역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 언어
        • C
        • C++
        • C#
      • 엔진, 프레임워크
        • Unity
        • Unreal
        • Electron
      • 공부
        • 디자인 패턴
        • 수학
        • CS
        • Git
        • 알고리즘
        • 자료구조
      • 코테
        • 프로그래머스
        • 백준
      • 독서
        • Effective C#
        • CLR via C#
        • 뇌를 자극하는 윈도우즈 시스템 프로그래밍
        • 오브젝트
        • CSAPP
        • OSTEP
        • 이득우의 게임 수학
      • 프로젝트
        • Unity
      • 개발 일지
        • 퓨처리티
        • 골든타임
      • 활동
        • 게임잼 후기
        • 게임제작동아리 브릿지
        • 크래프톤 정글
        • 기타
      • 기타
  • 블로그 메뉴

    • 링크

    • 공지사항

      • 2024 04 17
    • 인기 글

    • 태그

      오블완
      인프런 #인프런강의후기 #게임개발 #게임개발강의 #인강후기 #강의후기 #게임개발자 #인프런강의
      티스토리챌린지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    태역
    [스터디] 시스템 프로그래밍 - Chapter 3. 64비트 기반 프로그래밍
    상단으로

    티스토리툴바