1. LIMIT 체크

(1) 세그먼트 디스크립터의 Limit G 비트

세그먼트 디스크립터의 LIMIT 프로그램 또는 프로세스가 세그먼트 외의 메모리 영역을 접근하지 못하게 합니다. 세그먼트 디스크립터의 lmit G 비트에 영향을 받고, G 0 , lmit 세그먼트에 명시된 값과 같으며(1byte 단위), G 비트가 1 경우 명시된 값의 0xFFF 입니다.

 

(2) 보호 예외(#GP)

세그먼트 영역에서 유효 LIMIT 전체 세그먼트 영역의 크기에서 1바이트 같습니다. (주소가 0 부터 시작 하기 때문입니다.)

다음과 같은 경우에는 #GP 일으킵니다.

Byte > limit-1(오프셋이 유효 Limit 보다 바이트 )

Word>limit-2(오프셋이 유효 Limit -1 보다 워드)

Dword>limit-4(오프셋이 유효 Limit-3 바이트 보다 더블 워드)

Qword>limit-8(오프셋이 유효 Limit-7 바이트보다 쿼드 워드)

 

(3) Limit 효과

무효한 포인터 계산등의 프로그래밍 에러 검출

다른 세그먼트에 있는 코드나 데이터 보호

 

(4) GDT, IDT, TSS

CPU GDT IDT 같은 테이블과 TSS 영역의 크기를 체크합니다.

GDT -> GDTR 2바이트에 해당하는 Limit 이용

IDT -> IDTR 2바이트에 해당하는 Limit 이용

TSS -> TR 레지스터에 2 바이트에 해당하는 Limit 이용

 

2. Type 체크

(1) S 비트와 Type 필드

S 비트가 0이면 Type 필드가 시스템 Type이라는 것이고, 1이면 코드나 데이터 세그먼트의 Type이라는 뜻입니다.

S 0일때의 타입입니다.

Type

게이트 종류

0x0

예약됨

0x1

16 비트

0x2

LDT

0x3

Busy 16비트 TSS

0x4

16 비트 콜게이트

0x5

태스크 게이트

0x6

16비트 인터럽트 게이트

0x7

16비트 트랩 게이트

0x8

예약됨

0x9

32비트 TSS

0xA

예약됨

0xB

Busy 32비트 TSS

0xC

32비트 콜게이트

0xD

예약됨

0xE

32비트 인터럽트 게이트

0xF

32비트 트랩 게이트

 

Ex) P비트가 1, DPL 00 S 0이고 32비트 인터럽트 게이트 -> 0x8E

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Lmit 15 - 0비트

Base Address 15 - 0비트

1

00

0

0xE

Base Address 23 – 16 비트

Base Address 31 – 24 비트

G

D

0

AVL

Lmit 19 - 16비트

63

62

61

60

59

58

57

56

55

54

53

52

51

50

49

48

 

Ex) P비트가 1, DPL 00 S 0이고 32비트 TTS-> 0x89

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Lmit 15 - 0비트

Base Address 15 - 0비트

1

00

0

0x9

Base Address 23 – 16 비트

Base Address 31 – 24 비트

G

D

0

AVL

Lmit 19 - 16비트

63

62

61

60

59

58

57

56

55

54

53

52

51

50

49

48

 

Ex) P비트가 1, DPL 00 S 0이고 32비트 TTS,B비트 1-> 0x8B

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Lmit 15 - 0비트

Base Address 15 - 0비트

1

00

0

0xB

Base Address 23 – 16 비트

Base Address 31 – 24 비트

G

D

0

AVL

Lmit 19 - 16비트

63

62

61

60

59

58

57

56

55

54

53

52

51

50

49

48

 

CPU 다음과 같은 경우 type 정보를 조사합니다.

세그먼트 셀렉터가 세그먼트 레지스터에 로드

디스크립터가 세그먼트 레지스터에 이미 로드되어 있는 세그먼트에 명령이 액세스 

CALL JMP 명령의 오퍼랜드에 셀렉터가 있을 셀렉터에 대한 디스크립터의 Type 필드

+ Recent posts