Segment 기법이 가상 메모리 관리에서 사용된다.
Segment라고 하면 단편화? 라고 해석이 된다. 무엇을 단편화 한다는 것인가?
내용은 논리적 의미에 부합하도록 연속적인 공간을 할당 하는 것이라고 한다.
이게 무슨 의미인가?
하나의 process에서 code 영역과 데이터 영역, 스택 영역 등 여러가지 부분이 있을 것이다.
이러한 부분을 각각 분할 해서 메모리에 배열 한다는 것이다.
이러한 세그먼트를 찾아가기 위해서 segment table이 존재한다.
대표적인 segment table은 커널에 존재하는 Global Descriptor Table[GDT]와 Local
Descriptor Table[LDT]가 존재 한다.
그전에 Descriptor라는 용어에 대해서 설명 하고자 한다.
Descriptor란 어떤 것에 대해 설명하거나 가리킨 다는 뜻을 의미 한다.
즉 설명하는 내용이라고 생각하면 간단 할것이다.
아마 BaseAddress와 Privilege, Limit와 같은 것들이 설명되어 있지 않을까?
GDT는 무엇인지 알아본다.
커널도 하나의 프로그램이다. 그렇기 때문에 커널에서의 Code 영역과
Data 영역등이 있을 것이다. 커널에서 사용하는 Code와 Data 들을 정의 되어있는
Segment를 정의한 Descriptor를 정리 하고 모아 놓는 곳이 GDT이다.
각 Descriptor 마다 BaseAddr과 해당 세그먼트의 Limit 한계점이 표시 되어 있다.
그리고 권한 설정까지 적어 넣을 수 있다.
그렇기 때문에 다른 영역으로 접근 하려고 하면 Segment fault라고 오류가 뜨는 것이다.
좀 더 자세히 설명하면 해당 Descriptor에 0x1000번지가 base addr이고 limit가
0x100 이라고 가정하자. 그러면 0x1100이상의 주소에 접근 하고자 하면 오류가 발생
할 것이다. 이것이 segment fault인 것이다.
LDT는 태스크당 독립적인 세그먼트 디스크립터 테이블이다.
각각의 어플리케이션 마다 고유한 세그먼트를 정의 할 때 사용 되는 테이블이 LDT이
다.
LDT에 대한 Descriptor가 GDT에 존재하는 것이다.
여기서 헷갈린 부분은 LDT Descriptor 부분이였다. 여기서 Descriptor는 설명이라고 했
으니, Local Descriptor Table의 설명 즉 Table의 BaseAddress와 Limit 등 을 나타 내는
것이다. 위에서 나온 Segment Descriptor는 Segment에 대한 설명을 나타 낸 것이고,
LDT Descriptor는 Table에 대한 설명을 나타낸 것이다.
--> 이부분을 이해하는데 오래 걸렸다.. 용어를 하나 하나 잘 생각하면서 읽어야 한다..
그러면 참조 할 때는 어떻게 참조 되는지 생각 해보자.
그러면 LDT Descriptor를 참조해서 LDTR을 채워 넣게 된다. 그리고 LDTR을 참조해서
Table의 위치를 찾고 접근을 하게된다.
위의 그림에서 Segmentation 기법에 의해서 가상 주소에서 선형주소를 얻게 된다.
위와 같이 이론으로는 확인을 하였는데, 항상 궁금하던 것이 있다.
offset은 무엇을 의미 할까 항상...
segment selector가 우리가 알고 있는 CS, DS, SS와 같은것은 알겠는데,, OFFSET은
무엇이란 말인가?
CS같은 경우는 너무 자주? 많이? 사용해서 생략된다고 검색하다보니 알게 되었다.
하지만 DS, SS 같은 경우는 분석 하다보면 꽤 많이 만나는 경우가 있다. 이때를 예로
하는 그림이 있어서 첨부한다.
[출처]http://sekwonlee.blogspot.kr/2014/08/2-paging-segmentation.html
위의 그림을 보게되면 DS에 의해서 Segment의 Desc를 확인해서 BASEADDR을 찾고,
그리고 [0X1000]이 offset이 되어서 값을 확인 하게 된다..
위의 설명을 한 이유는 결국... 선형주소[Leaner Address]를 구하기 위함.
'학부_대학원 > 운영체제' 카테고리의 다른 글
크리티컬 섹션 vs 뮤텍스 vs 세마포어 (0) | 2016.07.25 |
---|---|
가상 메모리 to 물리 메모리[용어] (0) | 2016.07.25 |
내부 단편화vs외부 단편화 (0) | 2016.07.24 |
가상 메모리 to 물리 메모리[1] (0) | 2016.07.24 |
cache coherence[케시 일관성] (0) | 2016.07.24 |