Search

'Question!!'에 해당되는 글 8건

  1. 2013.01.11 9장 구조체 바이트 정렬 6

9장 구조체 바이트 정렬

Question!! 2013. 1. 11. 13:17 Posted by 알 수 없는 사용자

 

9장에서 64비트 주소를 두부분으로 나누는데 이부분이 이해가 안되서 질문좀..

내가 알기로 분명히 인텔 CPU는 리틀 엔디안이다.

따라서 64비트를 구조체로 만들어 두 부분으로 나누려면

 

typedef struct kPageTableEntryStruct
{
	DWORD dwLowerBase;
	DWORD dwUppaderBase;
} PML4ENTRY, PDTENTRY, PDENTRY, PTENTRY;

 

이게 아니라

 

typedef struct kPageTableEntryStruct
{
	DWORD dwUpperBase;
	DWORD dwLowerBase;

} PML4ENTRY, PDTENTRY, PDENTRY, PTENTRY;

 

처럼 되야한다고 생각했다.

만약 처음처럼 구조체 멤버에서 LowerBase가 윗부분으로 올라가면

 

 

 

파일상에서 다음과 같이 뒤집혀 버리기 때문이다.

지금은 32비트니까 32비트 단위로 읽는건 이해가 되는데

 

그러면 64비트 넘어가면 한번에 64비트씩 읽기 때문에

메모리에 올라간 파일 구조체를 다시 바꿔줘야 하지 않나 싶음.

안그러면 0x12345678AABBCCDD 을 0xAABBCCDD12345678 로 바꿔읽게 될거같은데

이거 답 아는분 리플점..

 

아래는 그냥 비주얼스튜디오에서 실험해본 신박한 실험.

 

 

다른건 별 신기한게 없고 갈색부분 short가 2바이트가 아니라 4바이트로 정렬되는게 신기. 뒷부분은 상관 없는데

short 앞부분에 머가 있으면 바로 다음 4바이트로 건너 뜀.

 

 

* 2013-01-11 해결

X86_64는 48비트 어드레스 버스를 가지고 있다. 따라서 64비트 주소를 한번에 읽지 못하고 나눠서 읽는다.

아마 32+32 일듯 하다.

그리고 인텔 메뉴얼에 있는 배열은 그대로 메모리로 생각하면 된다. 하위바이트는 하위 바이트에.

CPU가 읽은 상태가 아니다.

 

참조

- http://www.linuxquestions.org/questions/linux-hardware-18/64-bit-cpus-and-the-address-bus-632797/

- http://en.wikipedia.org/wiki/X86-64

- http://stackoverflow.com/questions/10927878/32-bit-v-s-64-bit