2008년 09월 26일
출처 :
http://blog.naver.com/minochang?Redirect=Log&logNo=140005449443 |
인텔 x86 아키텍처의 이해 앞에서 간략히 컴퓨터 시스템의 전반적인 부분을 살펴봤고, 가상 머신을 설계하기에 앞서 쉽게 접할 수 있는 인텔 x86 아키텍처를 더 자세히 알아보자. TVM은 인텔 x86 아키텍처를 기본 모델로 삼아 간단히 구현되었다.
레지스터 구조 레지스터는 CPU 내에 있는 임시 기억 장소로 인텔 x86 패밀리는 <그림 5>와 같은 구조를 가진다. 레지스터는 CPU 내에 존재하는 임시 기억장소이므로 연산속도가 메모리를 참조하는 속도에 비해 훨씬 빠르다. 메모리를 참조하기 위해서는 메모리에 얻고자 하는 번지를 주고 읽는 명령을 주고 난 후, 정해진 싸이클이 지난 후에 원하는 데이터를 얻어서 연산을 하는 반면 레지스터를 이용하면 이 과정이 생략되기 때문에 훨씬 빠르다. 인텔 x86 아키텍처에서 사용자가 C언어로 개발한 프로그램은 최종적으로 인텔이 정의한 OPcode와 앞의 레지스터와 숫자의 조합으로 기계 코드를 구성하고 수행을 하게 된다. 각 레지스터에 대한 자세한 사항은 참고자료를 참고하기 바란다.

세그멘테이션 8086에서 지원하는 메모리 구조는 linear addressing과 segmented addressing이 있는데, linear addressing은 메모리를 전체적으로 하나의 선형적인 배열로 관리하는 방법이고, segmented addressing은 메모리를 세그멘트(segment)로 나누어 관리하는 방법이다. 8086은 어드레스 비트가 16비트이기 때문에 linear addressing으로는 2^16인 64KB만 처리할 수 있는 반면, segmented addressing은 segment register를 사용하여 2^20인 1MB까지 액세스할 수 있다. <그림 6>은 segmented addressing으로 프로그램의 메모리를 관리하는 예이다. <그림 6>을 보면 프로그램 실행에 필요한 정보들을 세그멘트별로 나눠 관리한다. 세그멘트 레지스터(segment register)가 메모리 번지의 상위 16비트를 가리키고 하위 16비트는 각 세그멘트에 맞는 오프셋(offset)이 결정한다. 일반적으로 CS와 IP가 다음에 실행할 기계 코드를 가리키고, DS와 SI가 데이터의 위치를 SS와 SP가 스택을 가리킨다. 추가적으로 ES와 DI가 스트링 연산 시 목적 주소를 가리키기도 한다. 다음은 CS와 IP가 가리키는 실재 물리 주소 값을 구하는 방법이다. TVM에서는 프로그램 실행을 위해 CS, DS, SS와 추가적인 세그멘트를 생성하여 참조한다.


바이트 오더 물리 메모리(physical memory)는 선형적인 구조를 가지고 있다. 처음 번지부터 마지막 번지까지 1바이트의 배열로 생각할 수 있다. 바이트를 저장하는 방식으로 빅 엔디언(big endian)과 리틀 엔디언(little endian)이 있는데, 이 둘의 차이점은 <그림 7>과 같다. <그림 7>은 0x04030201을 저장했을 때, 실재 메모리에 저장된 값을 보인 것이다. 그림에서 보듯이 빅 엔디언은 최상위 바이트인 0x04가 가장 낮은 메모리 번지부터 저장되고 리틀 엔디언은 최하위 바이트인 0x01이 가장 낮은 메모리 번지로부터 저장되는 방식이다. 빅 엔디언의 장점은 정수의 높은 자릿수가 낮은 번지에 저장되기 때문에 낮은 번지부터 높은 번지로 읽으면서 정수 비교를 빨리 할 수 있다는 것이다. 리틀 엔디언의 장점은 산술 연산은 낮은 자릿수부터 이루어지므로 메모리를 낮은 번지부터 읽으면서 연산을 하면 연산이 더 쉬워진다. 또한 long형을 short형으로 캐스팅 연산하는 경우처럼 크기가 큰 정수에서 작은 정수로의 캐스팅 연산이 수월하다는 장점이 있다. 쉽게 말해 0x04030201을 short형 2바이트로 캐스팅 연산할 경우 리틀 엔디언은 기존의 포인터에서 2바이트만 참조하면 되지만, 빅 엔디언은 기존의 포인터에 2를 더한 12번지에서 2바이트를 참조해야 한다. 빅 엔디언은 썬 스팍이나 매킨토시, 모토로라 등이 사용하고, 리틀 엔디언은 인텔 x86이나 DEC3100 등에서 사용한다. 가상 머신은 대부분의 아키텍처와 호환성을 가져야 하므로 빅 엔디언과 리틀 엔디언을 모두 적용해 줘야 한다. TVM에서는 기본적으로 빅 엔디언을 사용하고 리틀 엔디언을 사용하는 아키텍처를 위해 데이터를 변환하는 루틴을 가지고 있다.

|
|
# by amplengine | 2008/09/26 10:32 | Virtual Machine | 트랙백 | 덧글(0)
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]