세그멘테이션에 관하여.

홍문화 2011.07.22 15:05 조회 수 : 7531

지난 스터디 시간에 세그멘테이션을 주제로 두 멤버님께서 열렬히? 토론 하시는것을 보았습니다.

쉬는 시간이었던지라 경원대 강의실의 첨단 시스템들을 요리조리 구경하면서 대강 흘려 넘겼습니다.ㅋ

평소 저도 제대로 이해를 하지 못하고 있던 부분이라 해답을 찾고자 "만들면서 배우는 OS 커널의 구조와 원리"를 완독하였습니다.

하지만 안타깝게도 세그멘테이션을 시원하게 이해하지 못하여 이렇게 자문을 구하는 바입니다.


기본적으로 세그멘테이션이라는 기법은 메모리 관리 기법으로 내부 단편화를 줄이기 위한 방법으로 이해하고 있습니다.

8086, DOS 기반 프로그래밍에서는 세그멘테이션 기법을 유용하게 사용했을거라 생각합니다.

640KB 메모리를 효율적으로 사용하기 위해서 프로그램이 사용하는 메모리를 CS와 DS 영역으로 적절하게 설정하여

프로그램의 코드와 데이터를 각각의 세그먼트 영역에 올려서 사용하지 않았을까 합니다.

여기서 질문1. 왜 8086은 ARM이나 MIPS 처럼 바로 페이징을 적용하지 않았나 하는 것입니다.

당시의 기술적 한계(MMU를 개발 못함)였다면 어쩔수 없었으리라 생각됩니다.


이후의 프로세서에는 리얼모드의 단점을 극복한 프로텍티드 모드가 지원됩니다.

리얼모드의 단점 1 : 제한된 메모리 사용 (최대 1MB)과 메모리 참조의 불편함.

참고 : http://blog.naver.com/hyuga777?Redirect=Log&logNo=80125702627

리얼모드의 단점 2 : 메모리 보호가 어려움.

프로텍티드 모드에서는 64비트 디스크립터에서 Limit로 세그먼트 옵셋의 범위를 제한함으로써 메모리 보호가 가능해졌습니다.

또한 디스크립터의 DPL과 세그먼트 셀렉터의 RPL을 통해 유저모드와 커널모드간의 메모리 보호가 가능해졌습니다.

여기서 질문2. 386, 486 등등 이후의 프로세서에서 8086과의 호환을 위해 리얼모드를 지원합니다. 하지만 현재 8086에서

돌아가던 프로그램을 사용하지도 않는데 아직까지 리얼모드를 지원하는 이유는 뭘까요?


프로텍티드 모드에서는 세그멘테이션과 함께 페이징을 지원합니다.

대부분의 커널 책에서 x86 의 주소변환 과정에 대해 아래와 같이 친절히 설명을 하고 있습니다.

세그멘테이션(논리주소) => 페이징(선형주소) => 물리주소

하지만 과연 가변 분할 메모리 관리라는 진정한 의미에서의 세그멘테이션 기법이 동작하고 있느냐? 라는 관점에서

생각을 했을때 그렇지 않다는 생각을 할 수 밖에 없었습니다.

유저모드 CS, DS 커널모드 CS, DS 모두 베이스 주소는 0이고 리미트는 4GB 입니다.

커널은 그렇다고 하더라도 어떠한 프로그램이 실행 되어도 0 ~ 4GB의 논리 주소를 가지게 됩니다.

세그멘테이션 기법을 따른다면 각각의 프로그램은 자신만의 64비트 디스크립터를 가지게 되고 서로 다른 베이스 주소와

리미트 크기를 가져야 하는것이 아닌가 생각합니다.

이러한 관점에서 봤을 때 x86은 모든 세그먼트를 0 ~ 4GB의 동일한 논리 주소 하나의 영역으로 보는것으로 판단 됩니다.

현제까지 제가 파악한 x86 세그멘테이션에서 유일하게 의미가 있는 것은 GDT를 통해 TSS에 접근 하는것이 아닌가 생각합니다.

여기서 질문3. 만일 그러하다면 실질적으로 무의미한 세그멘테이션 과정을 없애고 페이징 기법만을 사용하는 것이 효율적이지

않을까요?


여기서 질문4. 컴파일 타임에 생성되는 프로그램의 주소는 가상주소(선형주소)로 알고있습니다.

세그먼트는 0 ~ 4GB로 하나이고 실질적으로 의미있는 세그멘테이션 동작을 하지 않으므로 프로그램에 할당 되는

가상 주소와 매핑 되는 논리주소는 가상주소와 동일하거나 또는 없다고 봐야하지 않을까요?



현재 저의 이해 수준에서 글을 쓰다보니 제대로 쓴건지 모르겠습니다.

생각이 정리되고 해답을 찾게되면 저 또한 자답을 해보겠습니다.

이미 이해하고 계신 멤버님이 계시다면 답변을 부탁 드립니다.

혹은 저와는 다른 관점에서 의문을 가지고 계신 멤버님이 계시다면 같이 공유 했으면 하는 바람입니다.

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2202
1145 [ARM초] 7월 30일 스터디 장소 [3] myskan 2011.07.30 2391
1144 7월 30일 모임+참석인원 설문조사 [9] 정현철 2011.07.28 3410
1143 [ARM중] U-boot 분석 계획 [4] file 홍문화 2011.07.25 5523
1142 [ARM초] 7월 23일 스터디 장소 [2] myskan 2011.07.23 2826
1141 7/23 스터디 장소는 비트인가요? [1] Jason 2011.07.22 2521
» 세그멘테이션에 관하여. [12] 홍문화 2011.07.22 7531
1139 7월 23일 모임 장소 + 회식 인원 조사 [8] 정현철 2011.07.18 3489
1138 BOOT Program 학습자료 추천합니다. [1] file 장성민 2011.07.18 2597
1137 7월 16일 스터디 장소 [5] 정현철 2011.07.13 3667
1136 책 하나 소개해 봅니다. [1] 홍문화 2011.07.13 3749
1135 페이지 테이블에 주소 변환 정보가 채워지는 원리 [16] 홍문화 2011.07.12 16326
1134 likely/unlikely 사용시 차이점 [9] 박량우 2011.07.11 6839
1133 오류도서관 23일 예약이 이미 끝났답니다 ㅠㅠ [10] Jason 2011.07.10 3710
1132 [ARM 초] 7월 9일 스터디 장소 - 최종 [4] myskan 2011.07.09 3420
1131 내일 드디어 마지막 단원입니다. [3] 홍문화 2011.07.08 2776
1130 7월 9일 스터디 장소 [14] 김민호 2011.07.06 4258
1129 교재 477쪽 "자체 수정 코드" 관련 내용입니다. 홍문화 2011.07.06 4243
1128 스터디룸 꾀 비싸네요. [3] 홍문화 2011.07.04 3074
1127 드디어 최종 성적이 나왔네요 [18] file 홍성진 2011.07.04 4022
1126 [ARM초]스터디 교재 변경... [1] 권홍재 2011.07.03 3769
XE Login