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 필드
'Operating Systems > OS 커널 제작' 카테고리의 다른 글
7. 유저모드 Task Switching (1) – 유저모드와 콜게이트 (0) | 2015.01.31 |
---|---|
6. 보호 (2) – 특권 레벨 (0) | 2015.01.29 |
5. Task Switching (2) – 태스크 스위칭 (0) | 2015.01.26 |
5. Task Switching (1) - TSS (0) | 2015.01.22 |
4. Interrupt 와 Exception (4) - 예외 (0) | 2015.01.20 |