1) segmentation정의
- 사용자 지정 메모리로부터 Linear Address(메모리주소 + 세그먼트 레지스터)까지 얻어지는 과정
2) Segmentation과정
① GDTR(Global Descriptor Table Register)을 참조하여 GDT(Global Descriptor Table)의 Base주소를 찾습니다.
- GDTR의 GDT Base Address를 얻습니다.
- GDTR Size (Table Limit = Descriptor 개수 X 8-1이므로 8192 ) : 첫번째 Descriptor는 null Descriptor임
② Segment Selector를 Index로 GDT[Index]하여 SegmentDescriptor를 찾습니다.
GDTR로부터 얻은 GDT Base Address로부터 GDT 배열주소를 얻습니다.
이후 Segment Register에 저장된 Segment Selector(cs, ss, ds등)를 인덱스로 Segment Descriptor를 참조합니다.
- Base Address (16bit ~ 39bit , 56bit ~ 63bit) : 최종적으로 세그먼트를 통해 메모리에 접근할때 offset과 더해지는 값
- S : system bit
-> 0 : LDT 또는 CallGate와 같은 특수한 목적으로 사용되는 시스템 디스크립터
-> 1 : 코드세그먼트,데이터세그먼트,스택세그먼트등
- Type : 세그먼트 타입(Code/Data)과 세그먼트의 속성(읽기/실행)의 정보를 담습니다.
타입에 따른 속성은 다음의 표와 같습니다.
③ Segment Descriptor의 BaseAddress영역과 Offset을 더하여 Linear Address를 생성합니다.
Segment |
Offset(메모리주소) |
목적 |
코드 Segment( CS) |
IP |
수행되어질 명렁어의 위치 |
스택 Segment(SS) |
SP또는 BP |
스택 주소 참조 |
데이터 Segment(Data Segment) |
AX,BX,CX와 같은 범용레지스터와 DI,SI |
데이터주소 참조 |
보조 Segment(ES) |
스트링 명령어를 위한 DI |
스트링 목적지주소 |
3) 멀티테스킹환경
○ LDT(Local DescriptorTable)참조 과정
- LDT : Task당 독립적으로 존재하는 Descriptor Table
- LDT Descriptor : 프로세스당 할당되는 LDT의 정보를 담은 Descriptor ( GDT상에 존재 )
( DPL : 00 / S : 0 / Type : 0010b )
- LDTR( Segment Selector )
〮Index GDT or LDT의 Index를 참조
〮TI = 0 : GDT사용 / 1 : LDT사용
〮RPL : Descriptor 요구 특권레벨
'Security > Windows System' 카테고리의 다른 글
커널진입(INT 2E,SYSENTER)-전체적인흐름 (0) | 2017.06.23 |
---|---|
커널진입(INT 2E,SYSENTER)-INT 2E(IDT : Interrupt Descriptor Table)편 (0) | 2017.06.23 |
ASLR(Address Space Layout Randomization) 끄기 /비활성화 (0) | 2017.06.20 |
Segmentation과 Paging(3) - 페이징 (1) | 2017.06.18 |
Segmentation과 Paging(1) - 세그먼테이션과 페이징 전체적인 흐름 (1) | 2017.06.14 |
댓글