IT, 소프트웨어

애플리게이션 프로그래밍: I

꿈있는 내일 2010. 11. 14. 22:06

Part I 애플리케이션 프로그래밍

 

Chapter 2 프로그래밍 기본 모델

 

chapter는 프로세서가 보호모드에서 실행중일 때 어셈블리 언어 프로그래머가 볼 수 있는 80386 애플리케이션의 프로그래밍 환경을 설명한다. 프로그래머들에게 80386 애플리케이션 프로그램의 디자인과 구현에 직접적으로 영향을 줄 80386 구조의 특성들을 설명한다. 다른 Chapter는 시스템 프로그래밍이나 8086 계열의 다른 프로세서와의 호환성과 관련이 있는 80386 특성들을 설명한다.

 

프로그래밍 기본 모델은 아래의 주제들로  구성된다.

l 메모리 구성과 세그먼테이션l 데이터 타입l 레지스터l 인스트럭션 형식l 피연산자 선택l 인터럽트와 예외

 

입력과 출력은 프로그래밍 기본 모델에 포함하지 않는다. 시스템 디자이너가 I/O 인스트럭션을 애플리케이션이 사용할 수 있도록 하거나 이러한 기능을 OS에 위임하도록 할 것이다. 이러한 이유로 80386 I/O 특성들은 Part II에서 다룬다.

 

Chapter는 애플리케이션에서 일반적으로 사용이 가능한 아키텍쳐의 일면에 관한 섹션을 포함히고 있다.

 

 

2.1 메모리 구성 및 세그먼테이션

 

80386 시스템에서 물리적 메모리는 일련의 8비트 바이트들로 구성된다. 각 바이트는 0부터 최대 2^32 – 1(4 GB)에 이르는 유일한 주소가 할당된다.

 

하지만 80386 프로그램은 물리 주소 공간과는 별개이다. 이것은 얼마나 많은 물리적 메모리가 있는지, 정확히 어디에 인스트럭션과 데이터가 물리적 메모리에 위치했는지 몰라도 프로그램을 작성하는 데는 지장이 없다는 것을 의미한다.

 

애플리케이션 프로그래머들이 보는 메모리 구성 모델은 시스템-소프트웨어 디자이너에 달려 있다. 80386 아키텍처는 디자이너들이 자유롭게 각각의 작업을 선택할 수 있도록 한다. 메모리 구성 모델은 아래 지침을 따른다.

 

l 단일 배열로 4기가 바이트로 구성되는 “flat” 주소 공간l 16,383 선형 주소 공간의 컬렉션으로 구성되는 세그먼트된 주소 공간

 

두 모델은 메모리 보호 특성이 있다. 다른 작업들은 다른 메모리 구성 모델을 선택할 것이다. 디자이너들이 메모리 구성 모델을 결정하는 기준과 시스템 프로그래머 들이 그 모델을 구현하기 위해 사용하는 수단은 Part II – 시스템 프로그래밍에서 설명한다.

 

 

2.1.1 “Flat” 모델

 

“flat” 메모리 모델에서 애플리케이션 프로그래머에게 2^32 바이트( 4기가바이트)에 달하는 단일 배열을 사용할 수 있다. 물리적 메모리는 4기가바이트라 하더라도, 대개는 훨씬 작다; 프로세서는 4기가바이트 선형(flat) 공간을 Chapter 5에서 설명할 주소 변환 메커니즘에 따라 물리적 주소 공간으로 매핑한다. 애플리케이션 프로그래머는 매핑과 관련해서 상세하게 알 필요는 없다.

 

이러한 선형 주소 공간내의 포인터는 0 에서 2^32-1 내의 32비트 서수다. 이 공간 내의 별도로 컴파일된 모듈들의 재배치는 시스템 소프트웨어(예를 들면 링커, 로케이터, 바인더, 로더)가 한다.

 

 

2.1.2 세그먼트 모델

 

세그먼트 메모리 모델에서 애플리케이션 프로그래머가 볼 수 있는 주소 공간(논리 주소 공간이라 칭함)은 2^46 바이트(64 테라바이트)까지 훨씬 더 큰 공간이다. 프로세서는 64 테라바이트의 논리 주소 공간을 Chapter 5에서 다루겠지만 주소 변환 메커니즘의 따라 최대 4기가바이트의 물리적 메모리에 매핑한다. 애플리케이션 프로그래머는 매핑과 관련해서 자세하게 알 필요는 없다.

 

애플리케이션 프로그래머에게 80386 논리 주소공간은  16,386에 이르는 일정한 길이가 있는 1차원 부공간(subspace)으로 보인다. 이러한 각각의 선형 부공간을 세그먼트라 한다. 세그먼트는 정형화된 연속된 주소 공간이다. 세그먼트 크기는 1 바이트에서 최대 2^32 바이트(4 기가바이트)까지 변한다. 이러한 주소 공간에서 완전한 포인터는 두 파트로 구성된다(그림 2-1 참조)

 

1. 세그먼트 선택기(selector), 이것은 16비트 넓이로 세그먼트 식별자다.2. 오프셋, 이것은 한 세그먼트 내의 바이트 단위까지 표시하는 32비트 서수다.

 

프로그램을 실행하는 동안 프로세서는 세그먼트 선택기로 세그먼트의 물리적 시작 주소로 연결시킨다. 따로 컴파일된 모듈도 각각의 세

먼트의 기본 시작 주소를 바꿔서 실행 중에 재배치될 수 있다. 세그먼트 크기는 가변이다; 따라서 세그먼트는 정확히 모듈의 크기와 정확히

일치할 수 있다.

 

 

2.2 데이터 타입

 

바이트(byte), 워드(word), 더블워드(doubleword) 는 기본 데이터 타입이다(그림 2-2 참조). 한 바이트는 특정 논리 주소에서부터 연속된 8비트이다. 비트들은 0에서 7까지 번호가 붙여진다; 0번째 비트는 최하위 비트다.

워드는 특정 논리 주소에서부터 연속된 2개의 바이트다. 그래서 워드는 16비트다. 워드는 0에서 15까지 번호가 붙는다; 0번째 비트는 최하위 비트다. 워드에서 0번째 비트가 포함된 바이트를 로우 바이트(low byte)라 한다; 15번째 비트가 포함된 바이트를 하이 바이트(hight byte)라 한다.

 

 

 

 

한 워드 내의 각 바이트는 자신의 주소가 있다.

그리고 그 주소가 작은 쪽이 워드 주소다. 작은 주소의 바이트에 여덟 개의 최하위 비트가 있고 큰주소에 여덟 개의 최상위 비트가 있다.

 

더블워드는 특정 주소에서 시작해서 두개의 연속된 워드로 구성된다. 그래서 더블워드는 32비트다. 더블워드의 비트들은 0에서 31까지 번호가 붙여진다; 비트 0은 최하위 비트다. 더블워드에서 비트 0을 포함한 워드를 로우 워드라 한다; 비트 31이 포함된 워드를 하이 워드라 한다.

 

더블워드 내의 각 바이트는 자신의 고유 주소가 있고 주소가 가장 작은 것이 더블워드의 주소다. 가장 낮은 주소에 있는 바이트에 더블워드의 여덟 개의 최하위 비트가 있고 가장 높은 주소에 있는 바이트가 여덟 개의 최상위 비트가 있다. 그림 2-3은 워드와 더블워드 내 바이트 배열을 보여준다.

 

워드는 짝수 주소로 정렬될 필요는 없다. 더블워드도 4의 배수로 나눠질 필요는 없다. 이 때문에 데이터 구조를 최대한 유연하게 만들 수 있고(예를 들면, 바이트, 워드, 더블워드가 섞인 항목을 포함해서 기록할 경우), 메모리 효율적으로 사용할 수 있다. 32비트 버스로 설정된 경우, 실제 프로세서와 메모리간에는 4의 배수인 주소에서 시작해서 더블워드 단위로 데이터 전송이 일어난다; 하지만, 프로세서에서 정렬이 제대로 안된 워드나 더블워드가 메모리 인터페이스가 수용할 수 있도록 적절한 시퀀스로 변환된다. 그런 정렬이 제대로 안된 데이터를 전송하려면 추가 메모리 사이클이 필요해서 성능을 떨어진다. 최대 성능을 내기 위해서는 스택을 포함한 데이터 구조들이 가능하면 워드피연산자는 짝수 주소에 두고 더블워드 피연산자는 4의 배수에 두도록 해야 한다. CPU내 인스트럭션 선취(先取, prefetching)와 대기(待機, queuing)때문에 인스트럭션은 워드나 더블워드 경계로 정렬될 필요는 없다. (하지만 컨트롤 전송의 목적지 주소가 4의 배수면 약간의 속도 향상이 있다.)

 

 

 

비록 바이트, 워드, 더블워드는 피연산자의 기본 타입이지만, 프로세서는 또한 이러한 피연산자 외에도 추가 해석 기능(interpretation)을 지원한다. 피연산자를 참조하는 인스트럭션에 따라서 다음의 추가 데이터 타입이 지원된다.

 

정수(Integer):

32비트 더블워드, 16비트 워드, 혹은 8비트 바이트에 있는 부호가 있는 이진수. 모든 동작은 2의 보수 표현 형식을 취한다. 부호가 있는 비트는 바이트에서는 비트 7, 워드에서는 비트 15, 더블워드에서는 비트 31에 있다. 부호비트는 양의 정수일 경우 0, 음의 정수일 경우 1이다. 높은 자리수 비트는 부호를 표시하기 위해 사용하기 때문에 8비트 정수는 –128에서 +127의 범위를 갖는다; 16비트 정수는 –32768에서 +32767의 범위를 갖는다; 32비트 정수는 –2^31 에서 +2^31 – 1의 범위를 갖는다. 0은 + 부호를 갖는다.

 

서수(Ordinal):

32비트 더블워드, 16비트 워드, 8비트 바이트에 있는 부호가 없는 이진수. 모든 비트는 수의 크기를 결정한다. 8비트 서수는 0 – 255의 범위를 갖는다; 16비트는 0에서 65,535까지 표현할 수 있다; 32비트는 0에서 2^32 – 1까지 표현할 수 있다.

 

 

근거리 포인터(Near Pointer):

 

32비트 논리 주소. 근거리 포인터는 세그먼트간 오프셋(offset)이다. 근거리 포인터는 선형 혹은 세그먼트 메모리 구조에서 사용된다.

 

원거리 포인터(Far Pointer):

두 부분으로 구성된 48비트 논리 주소: 16비트 세그먼트 선택기 부분과 32비트 오프셋 부분. 원거리 포인터는 시스템 디자이너가 세그먼트 메모리 구성을 선택했을 때 애플리케이션 프로그래머가 사용한다.

 

문자열(String):

연속된 바이트, 워드 혹은 더블워드. 한 문자열은 0바이트에서 2^32 – 1 바이트(4 기가바이트)까지 가능하다.

 

비트 필드(Bit field):

연속된 비트. 비트필드는 임의 바이트 임의 위치에서 시작해서 32비트까지가 가능한 범위다.

 

비트 문자열(Bit string):

연속된 비트: 비트 문자열은 임의 바이트 임의 위치에서 시작해서 2^32 – 1 비트까지 가능한 범위다.

 

 

 

BCD:

0에서 9까지 십진수를 표현한 패킹되지 않은(unpacked) 바이트. 패킹되지 않은 십진수는 부호가 없이 저장된다. 한 개의 수는 각 바이트에 저장된다. 수의 크기는 낮은 자리 바이트 절반에 따라 결정된다; 16진수로 0 – 9는 유효하고 십진수로 해석된다. 높은 자리 절반은 곱셈과 나눗셈을 하기 위해 0이어야 한다; 여기에는 덧셈과 뺄셈을 위한 값일 수도 있다.

패킹된(Packed) BCD:

두 개의 십진수를 표현하기 위한 패킹된 바이트이고 각각은 0에서 9까지 범위를 갖는다. 한 숫자는 각각의 절반 바이트에 저장된다. 높은 자리 바이트의 절반은 최상위 숫자다. 각 바이트 절반은 0 – 9까지 유효하다. 패킹된 십진 바이트는 범위가 0 – 99다.

 

그림 2-4는 80386에서 지원하는 데이터 타입을 도식화해서 보여준다.

 

그림 2-1. 두 부분으로 구성된 포인터(Two-Component Pointer)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그림 2-2. 기본 데이터 타입

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그림 2-3. 메모리상에서 바이트, 워드, 더블워드

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그림 2-4. 80386 데이터 타입

 

 

 

'IT, 소프트웨어' 카테고리의 다른 글

웹의 단점  (0) 2011.01.05
애플리케이션 인스트럭션: I  (0) 2010.12.13
386 Intel 문서  (0) 2010.11.10
telnet 접속 암호 관련 - CE 5.0  (0) 2007.11.01
Network UI 커스터마이징  (0) 2007.10.09