IT, 소프트웨어

7. 멀티태스킹(Multitasking)

꿈있는 내일 2011. 2. 11. 16:08

Chapter 7   멀티태스킹(Multitasking)

 

 

효율적이고 보호된 멀티태스킹을 지원하기 위해, 80386은 몇 가지 특별한 데이터 구조를 사용한다. 하지만 멀티태스킹을 제어하기 위해 특별한 인스트럭션을 사용하지는 않는다; 대신에 일반적인 제어-이동 인스트럭션을 특별한 데이터 구조를 참조할 때 다르게 해석한다. 멀티태스킹을 지원하는 레지스터와 데이터 구조는 다음과 같다:

 

l        태스크 상태 세그먼트(Task state segment)l        태스크 상태 세그먼트 기술자(Task state segment descriptor)l        태스크 레지스터(Task register)l        태스크 게이트 기술자(Task gate descriptor)

 

이러한 구조를 가지고 80386은 한 태스크에서 다른 태스크로 빨리 실행을 전환할 수 있고, 본래 태스크의 컨텍스트(context)를 저장해서 나중에 재시작될 수 있다. 단순한 태스크 전환 외에도, 80386은 두 가지 다른 태스크-관리 특성을 제공한다.

 

1.       인터럽트와 예외는 태스크 전환을 발생시킬 수 있다(시스템 디자인에서 필요하다면). 프로세서는 그 인터럽트와 예외를 처리하는 태스크로 자동적으로 전환할 수 있을 뿐만 아니라, 인터럽트나 예외가 처리된 후에 인터럽트된 태스크로 자동적으로 되돌아간다. 인터럽트 태스크는 낮은-우선순위의 인터럽트 태스크라면 어떤 것이라도 입터럽트할 수 있다.2.       또 다른 태스크로 각각의 전환에 대해서, 80386은 또 다른 LDT 그리고 또 다른 페이지 디렉토리로 전환할 수 있다. 그래서 각 태스크는 다른 논리-선형 매팅과 다른 선형-물리 매핑을 가질 수 있다. 태스크들이 분리될 수 있고 상호 방해받는 것을 막을 수 있기 때문에 이것은 또 다른 보호 특성이다.

 

 

7.1 태스크 상태 세그먼트(Task State Segment)

 

태스크를 관리하기 위해 프로세서가 필요로 하는 모든 정보는 특별한 타입의 세그먼트, 태스크 상태세그먼트(TSS)에 저장된다. 그림 7-1은 실행 중인 80386 태스크에 대한 TSS의 형식을 나타낸다. (또 다른 형식은 실행 중인 80286 태스크에 사용된다. 13장 참조.)

 

TSS 필드들는 두 부류에 속한다.

 

1.       프로세서가 매번 작업 전환시 업데이트 하는 동적 세트. 이 세트는 저장할 다음 필드들을 포함한다:

 

l        범용 레지스터 (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI).l        세그먼트 레지스터 (ES, CS, SS, DS, FS, GS).l        플래그 레지스터 (EFLAGS).l        인터럽트 포인터 (EIP).l        이전에 실행중인 태스크의 TSS 선택기(반환이 예상될 때만 갱신되는)

 

2.       프로세서가 읽지만 변경하지 않는 상태 세트. 이 세트는 저장할 다음 필드를 포함한다.

 

l        태스크의 LDT 선택기l        태스크의 페이지 디렉토리의 베이스 주소를 포함한 레지스터(PDBR) (페이징이 활성화되었을 때 읽힌다).l        특권 레젤이 0-2인 스택 포인터l        태스크 전환이 발생했을 때 프로세서로 하여금 디버그 예외를 발생시키는 T-비트(debug trap bit). (디버깅에 관한 보다 많은 정보는 12장을 참조하라.)l        I/O 맵 베이스 (I/O 맵 사용에 관한 더 많은 정보는 8장을 참조하라).

 

태스크 상태 세그먼트는 선형 공간 어디에든 있을 수 있다. 단지 주의가 요구되는 것은 TSS가 페이지 경계를 가로지르는 경우이다. 이 경우에 태스크 전환시 TSS를 읽는 동안 존재하지 않는 페이지를 만난다면 프로세서는 예외를 발생시킨다. 그러한 예외는 두 방식중 어느 것으로 피할 수 있다.

 

1.       페이지 경계를 가로지르지 않도록 TSS를 할당하는 것2.       페이지 전환 시에 두 페이지가 모두 존재하거나 모두 존재하지 않거나를 확인하는 것. 두 페이지 모두 존재하지 않는다면, 페이지-폴트 처리기가 두 페이지를 존재하도록 해서 태스크 전환을 발생시켰던 인스트럭션을 재시작하도록 해야 한다.


 

그림 7-1.  80386 32-비트 태스크 상태 세그먼트

노트: 0은 인텔 예약. 정의하지 말 것

 

 

 

7.2 TSS 기술자

 

태스크 상태 세그먼트는 다른 모든 세그먼트처럼 기술자에 정의되어 있다. 그림 7-2는 TSS 기술자의 형식을 보여준다.

 

 

 

이 타입 필드에서 B-비트는 태스크가 바쁜지(busy)를 나타낸다. 타입 코드 9는 바쁘지 않은 태스크임을 나타낸다; 타입 코드 11은 바쁜 태스크임을 나타낸다. 태스크는 재진입할 수 없다. B-비트는 프로세서로 하여금 이미 바쁜 태스크로의 전환을 감지할 수 있도록 한다.

 

BASE, LIMIT, 그리고 DPL 필드 그리고 G-비트, P-비트는 데이터 세그먼트 기술자에 있는 것들과 비슷한 기능을 가지고 있다. 하지만 LIMIT 필드는 103보다 크거나 동일한 값이어야 한다. TSS 기술자가 103보다 작은 값인 태스크로 전환하려 하면 예외를 발생시킨다. 보다 큰 한계는 허용되고, I/O 허용 맵이 있다면 보다 큰 한계가 필요하다. 한계를 보다 크게 하면, 추가 데이터가 TSS로 동일한 세그먼트에 저장될 경우에 시스템 소프트웨어가 처리하기에 편리하다.

 

 

 

TSS 기술자에 접근하는 프로시져는 태스크 전환을 발생시킬 수 있다. 대부분 시스템에서 TSS 기술자의 DPL 필드들은 0으로 셋팅되어야 하고 그래서 단지 신뢰할 만한 소프트웨어만이 태스크 스위칭을 할 권한을 가지도록 한다.

 

TSS-기술자 접근권한이 있다고 해서 프로시져가 TSS를 읽거나 바꿀 수 있는 권한이 있다는 것은 아니다. 읽기와 변경은 데이터 세그먼트로 TSS를 재정의하는 또 다른 기술자를 사용해서만이 가능하다. TSS 기술자를 세그먼트 레지스터 (CS, SS, DS, ES, FS, GS)에 적재하려 시도하면 예외를 발생시킨다.

 

TSS 기술자는 GDT에만 있다. TI=1(현재 LDT를 나타냄)인 선택기를 가진 TSS를 알아 내려 시도하면 예외를 발생시킨다.

 

그림 7-2.  32-비트 TSS에 대한 TSS 기술자

 

 

 

 

7.3 태스크 레지스터

 

태스크 레지스터 (TR)은 현재 실행 중인 태스크를 TSS를 가리킴으로써 나타낸다. 그림 7-3은 프로세서가 접근하는 현재 TSS의 경로를 보여 준다.

 

태스크 레지스터는 “가시(visible)” 영역 (즉, 인스트럭션으로 읽고 변경 가능한)과 “비가시(invisible)” 영역(가시적인 영역에 대응하기 위해 프로세서에서 처리되고 어떤 인스트럭션으로도 읽을 수 없는)이 있다. 가시적인 영역의 선택기는 GDT에 있는 TSS 기술자를 선택한다. 프로세서는 TSS기술자에서 베이트와 한계를 개싱하기 위해 비가시 영역을 사용한다. 베이트와 한계를 레지스터에 저장해서 태스크를 더욱 효율적으로 실행할 수 있는데, 프로세서가 현재 태스크의 TSS를 참조할 때 메모리에서 반복적으로 읽어 들일 필요가 없기 때문이다.

 

LTR과 STR 인스트럭션은 태스크 레지스터의 가시 영역을 읽고 변경하기 위해 사용된다. 두 인스트럭션은 하나의 피연산자, 메모리나 범용 레지스터에 있는 16비트 선택기를 사용한다.

 

LTR (Load task register)는 태스크 레지스터의 가시 영역에 선택기의 피연산자를 적재하는데, 이 피연산자는 GDT에 있는 TSS 기술자를 선택해야 한다. LTR은 (Load task register)은 또한 피연산자가 지정하는 TSS 기술자에서 얻은 정보를 비가시영역에 적재한다. LTR은 특권화된 인스트럭션이다; CPL이 0일 때만 실행된다. LTR은 일반적으로 시스템 초기화 도중에 태스크 레지스터에 초기값을 주기 위해 사용된다; 따라서 TR의 내용은 태스크 전환 연산할 때 변경된다.

 

STR (Store task register) 는 태스크 레지스터의 가시영역을 범용 레지스터나 메모리 워드에 저장한다. STR은 특권화되어 있지 않다.


 

그림 7-3.  태스크 레지스터

 

 

 

 

 

 

7.4 태스크 게이트 기술자

 

태스크 게이트 기술자를 통해서 TSS를 간접적이고 보호된 참조를 할 수가 있다. 그림 7-4는 태스크 게이트의 형식을 나타낸다.

 

태스크 게이트의 SELECTOR 필드는 TSS 기술자를 참조해야 한다. 이 선택기에서 RPL 값은 프로세서가 사용하지 않는다.

 

 

 

태스크 세이트의 DPL 필드는 태스크 전환을 하기 위해 기술자를 사용할 권한을 제어한다. 프로시져는 선택기의 RPL과 프로시져의 CPL중 최대값이 숫자상 기술자의 DPL과 같거나 작지 않다면 태스크 게이트 기술자를 선택하지 못할 것이다. 이런 제약으로 신뢰성이 없는 프로시져가 태스크 스위칭하는 것을 막는다. (태스크 게이트가 사용될 때, 목적지 TSS 기술자의 DPL은 특권 체킹하는 데 사용되지 않는다.)

 

태스크 게이트를 접근하는 프로시져는, TSS 기술자를 접근하는 프로시져처럼 태스크 전환을 발생시킬 수 있다. 80386에는 다음 세가지 요구사항을 만족하기 위해 TSS 기술자 외에도 태스크 게이트들이 있다.

 

 

 

1.       태스크가 단일 바쁜(busy) 비트를 가질 필요성. 바쁨-비트는 TSS 기술자에 저장되고, 각 태스크는 단지 하나의 그러한 기술자를 가져야 한다. 하지만 단일 TSS 기술자를 선택하는 몇 개의 태스크 게이트들이 있을 것이다.

2.       태스크에 선택적 접근을 제공할 필요성. 태스크 게이트는 이러한 요구사항을 만족시킨다. 왜냐하면 이것들은 LDT에 상주하고 TSS 기술자의 DPL과는 다른 DPL을 가질 수 있기 때문이다. GDT에 있는 TSS 기술자(대개 DPL이 0)를 사용할 충분한 권한이 없는 프로시져가 LDT에 있는 태스크의 태스크 게이트에 접근할 수 있다면 역시 또 다른 태스크로 전환할 수 있다.

3.       인터럽트나 예외가 태스크 전환을 발생할 필요성. 태스크 게이트는 또한 LDT에 상주하고 인터럽트나 예외가 태스크 전환을 가능하도록 한다. 인터럽트나 예외는 태스크 게이트가 있는 IDT 진입점을 벡터(vector)화할 때, 80386은 지정한 태스크로 전환한다. 이리하여 시스템상의 모든 태스크는 인터럽트 태스크로부터 분리해서 제공되는 보호 잇점을 얻을 수 있다.

 

그림 7-5는 어떻게 LDT의 태스크 게이트와 IDT의 태스크 게이트 모두가 동일한 태스크를 명시하는지를 보여준다.

 

 

 

그림 7-4.  태스크 게이트 기술자

 

 

 

 

그림 7-5.  태스크 게이트는 간접적으로 태스크를 가리킨다.

 

 

 

 

 

7.5 태스크 전환(Task Switching)

 

80386은 네 경우 중 하나로 다른 태스크로 실행을 전환한다.

 

1.       현재 태스크가 TSS 기술자를 참조하는 JMP나 CALL을 실행한다.

2.       현재 태스크가 태스크 게이트를 참조하는 JMP나 CALL을 실행한다.

3.       인터럽트나 예외가 IDT에 있는 태스크 게이트로 이동한다.

4.       현재 태스크가 NT 플래그가 셋팅되었을 때 IRET를 실행한다.

 

JMP, CALL, IRET, 인터럽트, 예외는 모두 태스크 전환을 필요하지 않는 환경에서 사용될 수 있는 80386의 일반적인 메커니즘이다. 참조되는 기술자 타입이나 플래그워드에서 NT(nested task) 비트가 표준 메커니즘과 태스크 스위치를 발생시키는 것을 구분 짓는다.

 

태스크를 전환하기 위해서는, JMP나 CALL 인스트럭션이 TSS 기술자나 태스크 게이트를 참조할 수 있다. 결과는 어느 경우에나 동일하다: 80386은지정한 태스크로 전환한다.

 

예외나 인터럽트는 IDT에 있는 태스크 게이트로 이동(vector)할 때 태스크 전환을 발생시킨다. 만일 인터럽트나 IDT의 트랩 게이트로 이동할 떄, 태스크 전환은 발생하지 않는다. 인터럽트 메가니즘에 관해 더 많은 정보는 9장을 참조하라.

 

태스크나 혹은 인터럽트된 태스크의 프로시져로 야기되었던 간에, 인터럽트 처리기는 항상 인터럽트된 태스크에 있는 인터럽트된 프로시져로 제어를 반환한다. 하지만 NT 플래그가 셋팅되면 처리기는 한 인터럽트 태스크이고 IRET는 인터럽트된 태스크로 되돌려 전환한다.

 

태스크 전환 연산은 다음 단계를 밟는다:

 

1.       현재 태스크가 지정한 태스크로 전환이 허용되어 있는지 체킹. 데이터 접근 권한 규칙은 JMP나 CALL 인스트럭션의 경우에 적용된다. TSS 기술자나 태스크 게이트의 DPL은 CPL이나 게이트 선택기의 RPL 최대값과 같거나 더 작아야 한다. 예외, 인터럽트, 그리고 IRET들은 목적지 태스크 게이트나 TSS 기술자의 DPL에 상관없이 태스크를 전환할 수가 있다.

2.       새로운 태스크의 TSS 기술자가 존재한다고 마킹되고 유효한 한계를 가지고 있는지 체킹. 이 곳에서의 에러는 진출(outgoing) 태스크의 컨텍스트에서 발생한다. 에러는 재시작할 수 있고 애플리케이션 프로시져에서 보이는 방식으로 처리될 수 있다.

3.       현재 태스크 상태 저장. 프로세서는 태스크 레지스터에 캐싱된 현재 TSS 레지스터의 베이스 주소를 찾는다. 그리고 레지스터를 현재 TSS(EAX, ECX, EDX, EBX, EBP, ESI, EDI, ES, CS, SS, DS, FS, GS, 그리고 플래그 레지스터)로 복사한다. TSS의 EIP 필드는 태스크 전환을 발생시킨 인스트럭션 다음 인스트럭션을 가리킨다.

4.       진입(incoming) 태스크의 TSS 기술자 선택기를 바쁨으로 마킹하고, MSW의 TS(task switched) 비트를 셋팅하면서 태스크에 적재하는 것. 그 선택기는 제어 이동 인스트럭션의 피연산자거나 태스크 게이트에서 얻는다.

5.       진입 태스크 상태를 TSS에서 적재하고 실행을 재개하는 것. 적재된 레지스터들은 LDT 레지스터; 플래그 레지스터; 범용 레지스터들 EIP, EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI; 세그먼트 레지스터들 ES, CS, SS, DS, FS, 그리고 GS; 그리고 PDBR 이다. 이 단계에서 감지되는 에러들은 진입 태스크 컨텍스트에서 발생한다. 예외 처리기에게 새로운 태스크의 첫 인스트럭션은 아직 실행되지 않은 것처럼 보인다.

 

진출(outgoing) 태스크는 태스크 전환이 일어날 때 항상 저장된다. 태스크 실행이 재개되면 태스크 전환을 유발시킨 인스트럭셔 이후에 시작한다. 레지스터들은 태스크가 실행정지했을 때 가지고 있었던 값들로 복구된다.

 

모든 태스크가 전환할 때 MSW(machine status word)에 있는 TS (task switched) 비트를 셋팅한다. TS 플래그는 보조연산장치(수치보조연산장치)가 있을 때 시스템 소프트웨어에 유용하다. TS 비트는 보조연산장치 컨텍스트가 현재 80386 태스크에 적합하지 않을 수도 있다는 것을 알려 준다. 11장에서 TS 비트와 보조 연산장치에 관해 보다 자세히 다룬다.

 

진입(incoming) 태스크에서 태스크 전환 예외(테이블 7-1의 테스트 4에서 16때문에 발생하는 예외들)를 담당하는 예외 처리기들은 주의해서 예외를 발생시킨 선택기를 적재해야 한다. 그러한 동작은 예외 처리기가 우선 선택기를 검사하고 임의의 잠재적인 문제점을 고치지 않는다면, 또 다른 예외를 발생시킬 수 있다.

 

진입 태스크에서 실행이 재개되는 특권 레벨은 진출 태스크가 실행된 특권 레벨에 영향을 받지도 않고 제약되지도 않는다. 태스크들은 자신들의 독립 공간과 TSS들에 의해 독립되고 특권 규칙은 TSS에 부적절한 접근을 막는 데 사용되기 때문에, 어떤 특권 레벨도 태스크의 CPL들간의 관계를 제약하는 데 필요하지 않다. 새로운 태스크는 TSS에서 적재한 CS 선택기 값의 RPL이 지시하는 특권 레벨에서 실행을 시작한다.


 

테이블 7-1 태스크 전환 중에 생성되는 체크들

 

Test Test 설명 예외(Exception) Error Code Selects
NP = Segment-not-present exception, GP = General protection fault, TS = Invalid TSS, SF = Stack fault
1 Incomming TSS descriptor is present NP Incoming TSS
2 Incoming TSS descriptor is marked not-busy GP Incoming TSS
3 Limit of incoming TSS is greater than or equal to 103 TS Incoming TSS
- All register and selector values are loaded -
4 LDT selector of incoming task is valid TS Incoming TSS
5 LDT of incoming task is present TS Incoming TSS
6 CS selector is valid TS Code segment
선택기의 유효성 테스트는 선택기가 적절한 테이블에 있는지 있고(예를 들면 LDT 선택기는 GDT를 참조한다), 테이블 경계 내에 있고 적절한 기술자 타입을 참조하는지(예를 들면 LDT 선택기는 LDT 기술자를 참조한다)를 체크한다.
7 Code segment is present NP Code segment
8 Code segment DPL matches CS RPL TS Code segment
9 Stack segment is valid GP Stack segment
10 Stack segment is present SF Stack segment
11 Stack segment DPL = CPL SF Stack segment
12 Stack-selector RPL = CPL GP Stack segment
13 DS, ES, FS, GS selectors are valid GP Segment
14 DS, ES, FS, GS segments are readable GP Segment
15 DS, ES, FS, GS segments are present NP Segment
16 DS, ES, FS, GS segment DPL ≥ CPL (unless these are conforming segment) GP Segment

 

 

7.6 태스크 링킹(Task Linking)

 

TSS의 백링크(back-link)와 플래그 워드의 NT(nested task) 비트는 80386이 자동적으로 다른 태스크에 의해 호출되었거나 다른 태스크에 의해 인터럽트 되었던 태스크로 되돌아 간다. CALL 인스트럭션, 인터럽트 인스트럭션, 외부 인터럽트 혹은 예외로 인해 새로운 태스크로 전환되었을 때, 80386은 자동적으로 진출 태스크의 TSS 선택기를 새로운 TSS의 백링크로 채우고, 이와 동시에 새로운 태스크의 플래그 레지스터에 NT 비트를 셋팅한다. NT 플래그는 백링크 필드가 유효한지 아닌지를 나타낸다. 새로운 태스크는 IRET 인스트럭션을 실행함으로써 제어권을 놓는다. IRET를 해석할 때, 80386은 NT플래그를 검사한다. NT가 셋팅되었다면 80386은 백링크 필드가 선택한 태스크로 전화놘다. 테이블 7-2에 이러한 필드들 용도를 요약되어 있다.

 

테이블 7-2.  BUSY, NT, Back-Link에 태스크 스위치 영향

 

Affected Field Effect of JMP Instruction Effect of
CALL Instruction
Effect of
IRET Instruction
Busy bit of
Incoming task
Set, must be 0 before Set, must be 0 before Unchanged, must be set
Busy bit of
outgoing task
Cleared Unchanged
(already set)
Cleared
NT bit of incoming task Cleared Set Unchanged
NT bit of outgoing task Unchanged Unchanged Cleared
Back-link of incoming task Unchanged Set to outgoing TSS selector Unchanged
Back-link of outgoing task Unchanged Unchanged Unchanged

 

 

7.6.1 바쁨(Busy) 비트는 반복(Loops)은 막는다

 

TSS 기술자의 B-비트(busy 비트)로 백링크의 무결성을 확인할 수 있다. 백링크 체인은 인터럽트 태스크가 다른 인터럽트 태스크를 인터럽트하거나 호출된 태스크가 다른 태스크를 호출할 때 임의의 길이로 커질 수 있다. 바쁨 비트는 CPU가 새로운 루프를 생성하지 못하도록 감지할 수 있도록 한다. 루프는 이미 바쁜 태스크로 재진입 시도를 했는지를 나타낸다; 하지만 TSS는 재진입 가능한 자원이 아니다.

 

프로세서는 다음과 같이 바쁨 비트를 사용한다:

 

1.       태스크로 전환할 때, 프로세서는 자동적으로 새로운 태스크의 바쁨 비트를 셋팅한다.

2.       태스크에서 전환되었을 때, 프로세서는 그 태스크가 백링크 체인에 있지 않다면, 자동적으로 예전 태스크의 바쁨 비트를 비운다.(즉 태스크 전환을 유발시킨 인스트럭션이 JMP나 IRET일 경우). 만일 태스크가 백링크 체인에 있다면 바쁨 비트는 여전히 셋팅된다.

3.       태스크로 전환할 때, 프로세서는 새로운 태스크의 바쁨 비트가 이미 셋팅되어 있다면 예외를 발생시킨다.

 

이러한 동작으로 프로세서는 태스크가 자기 자신으로 스위칭하거나 백링크 체인에 있는 어떤 태스크로 전환하는 것을 방지한다.

 

바쁨 비트는 다중 프로세서 설정에서도 효율적이다. 왜냐하면 프로세서는 바쁨 비트를 셋팅하거나 비울 때, 자동적으로 버스 잠금(bus lock)을 하기 때문이다. 이렇게 해서 두 프로세서가 동일한 시간에 같은 태스크를 유발하지 않도록 한다. (다중 프로세싱에 관한 더 많은 것은 11장을 참조하라.)

 

 

7.6.2 태스크 링크 변경하기

 

태스크의 링크 순서를 변경하는 것은 오직 백링크와 바쁨-비트를 올바르게 수정할 수 있는 믿을만한 소프트웨어에 의해서만 가능해야 한다. 그러한 변경은 입터럽스 시킨 태스크 이전에 인터럽트 받은 태스크를 재개시킬 때 필요할 것이다. 백링크 체인에서 태스크를 제거하는 신뢰할만한 소프트웨어는 다음 정책들 중 하나를 따라야 한다:

 

1.       첫 째 인터럽트한 태스크의 TSS에서 백링크 필드를 변경하고 다음에 리스트에서 제거된 태스크의 TSS 기술자의 바쁨-비트를 비워라.

2.       백링크 체인과 바쁨 비트를 변경하는 동안 어떤 인터럽트도 발생하지 않도록 한다.

 

 

7.7 태스크 주소 공간

 

LDT 선택기와 TSS의 PDBR 필드는 소프트웨어 시스템 디자이너로 하여금 80386의 세그먼트와 페이지 매핑 특성을 유연하게 사용할 수 있도록 한다. 각 태스크에 적절한 세그먼트와 페이지 매핑을 사용해서 태스크는 주소 공간을 공유할 수 있거나 서로 매우 다른 주소 공간을 가질 수도 있거나 혹은 이러한 두 극단 사이에서 어느 정도의 공유도 할 수 있을 것이다.

 

태스크가 서로 다른 주소 공간을 가질 수 있는 능력은 80386 보호에서 중요하다. 한 태스크의 한 모듈은 그 모듈이 동일한 주소 공간에 접근할 권한이 없다면 다른 모듈과 상호 영향을 줄 수 없다. 80386의 유연한 메모리 관리 특성을 사용해서 시스템 디자이너는 상호 협력하도록 고안된 다른 태스크 모듈간에 공유 주소 공간을 할당할 수 있다.

 

 

7.7.1 태스크 선형-물리 공간 매핑(Task Linear-to-Physical Space Mapping)

 

태스크의 선형-물리 매핑 정돈에 관한 선택은 두 가지 일반적인 부류가 있다:

 

1.       모든 태스크들간에 공유되는 하나의 선형-물리 매핑.

 

페이징이 활성화되어 있지 않을 때, 이것은 단지 가능성이다. 페이지 테이블없다면 모든 선형 주소는 동일한 물리 주소에 매핑된다.

 

페이징이 활성화되어 있을 때, 이러한 스타일의 선형-물리 매핑은 모든 태스크에 대해 하나의 페이지 디렉토리를 사용함으로써 가능하다. 사용한 선형 공간은 OS가 또한 페이지 레벨의 가상 메모리를 구현한다면 가용한 물리 메모리를 초과할 것이다.

 

2.       일부가 겹쳐진 몇 개의 선형-물리 매핑.

 

이런 스타일은 각 태스크에 대해 다른 페이지 디렉토리를 사용함으로써 구현된다. PDBR(Page directory base register)는 각 태스크 전환할 때의 TSS에서 적재되기 때문에, 각 태스크는 다른 페이지 디렉토리를 가진다.

 

이론적으로 다른 태스크들의 선형 주소 공간은 완전히 다른 물리 주소에 매핑될 수 있다. 다른 페이지 디렉토리의 진입점이 다른 페이지 테이블을 가리키고 페이지 테이블들이 물리 메모리의 다른 페이지를 가리킨다면, 태스크들은 어떤 물리 주소를 공유하지 않는다.

 

실제적으로는 모든 태스크의 선형 주소 공간 일부가 동일한 물리 주소에 매핑해야 한다. 태스크 상태 세그먼트는 태스크가 전환하면서 프로세서가 TSS를 읽거나 변경하는 동안 TSS 주소 매핑이 바뀌지 않도록 공통 공간에 있어야 한다. GDT가 매핑한 선형 공간은 또한 공통 물리 공간에 매핑되어야 한다; 그렇지 않으면, GDT의 목적이 유명무실하게 된다. 그림 7-6은 어떻게 두 태스크의 선형 공간이 페이지 테이블을 공유하면서 물리 공간에서 중첩될 수 있는지 보여 준다.

 

 

7.7.2 태스크 논리 주소 공간(Task Logical Address Space)

 

공통적인 선형-물리 공간 매핑은 그 자체로 태스크간에 데이터를 공유하게 할 수는 없다. 데이터를 공유하기 위해서는 태스크들은 공통적인 논리-선형 공간 매핑이 있어야 한다; 즉, 공유하는 선형 주소 공간을 가리키는 기술자를 접근할 수 있어야 한다. 공통적인 논리-물리 주소 공유 매핑을 형성하기 위한 세 가지 방법이 있다:

 

1.       GDT를 통해서. 모든 태스크는 GDT에 있는 기술자를 접근한다. 그러한 기술자가 모든 태스크를 위한 공통 물리 주소로 매핑된 선형-주소 공간을 가리킨다면, 태스크들은 데이터와 인스트럭션을 공유할 수 있다.

2.       LDT를 공유함으로써. 두 개 혹은 그 이상의 태스크들은 TSS에 있는 LDT 선택기가 동일한 LDT 세그먼트를 선택한다면, 동일한 LDT를 사용할 수 있다. 공통 물리 공간에 매핑된 선형 공간을 가리키는 그러한 LDT-주둔 기술자를 사용해서 태스크들은 물리 메모리를 공유할 수 있다. 이러한 공유 방법은 GDT에 의한 공유보다 더욱 선택적이다; 공유는 특정 태스크에 제한될 수도 있다. 시스템의 다른 태스크들은 공유 영역에 접근할 수 없는 다른 LDT를 가질 수 있다.

3.       LDT에서 기술자 가명(alias)에 의해. 다른 LDT의 어떤 기술자들이 동일한 선형 주소 공간을 가리키는 것이 가능하다. 만일 선형 주소 공간이 관련된 태스크들의 페이지 매핑을 통해서 동일한 물리 공간에 매핑된다면, 이러한 기술자들은 태스크들로 하여금 공통 공간을 공유할 수 있도록 한다. 그러한 기술자들을 일반적으로 “가명(alias)”라 한다. 이러한 공유 방법은 이전의 두 방식보다 더욱 선택적이다; LDT의 다른 기술자들은 명백히 다른 선형 주소나 공유되지 않은 선형주소를 가리킬 것이다.


 

그림 7-6.  부분적으로 중첩된 선형 공간들(Partially-Overlapping Linear Spaces)