세그멘테이션에 관하여.

홍문화 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
1565 cell simulator에 관해 궁금함이.. [5] 성진모 2007.06.19 10124
1564 6월 23일 스터디 참석못할꺼 같습니다. 남용우 2007.06.22 4239
1563 추억의 HelpPC 유틸리티를 웹으로 구현한 사이트 지현구 2007.06.24 4217
1562 오랜만에 인사~ ^^ [4] 정필섭 2007.06.25 9697
1561 크윽 [3] 김종화 2007.06.25 9735
1560 오늘 스터디참여 못할것같습니다... [3] 선준규 2007.06.30 4092
1559 0630 [6] 김강년 2007.07.01 10378
1558 이번주 토요일에 늦을 것 같습니다. [1] 박경태 2007.07.05 3890
1557 오늘 스터디 못감 김재호 2007.07.07 9574
1556 memory map in powerpc kernel [1] file 김강년 2007.07.08 11267
1555 한동안 못가는 이유 [5] 김종화 2007.07.11 9683
1554 늦게 갈것 같습니다. 7/14 [1] 유상민 2007.07.14 3971
1553 PPC64 의 경우 궁금한 점 ??? [1] 장석원 2007.07.14 10170
1552 죄송합니다. 오늘 참석 못할 것 같습니다 --; 지현구 2007.07.14 3455
1551 이번주 스터디는 불참입니다. [1] 이종우 2007.07.21 3263
1550 오늘 조금 늦을것 같습니다. [1] 선준규 2007.07.21 3571
1549 end_pfn의 값을 올립니다. 남용우 2007.07.25 3118
1548 모니터 케이블 [1] 백창우 2007.08.08 3702
1547 리눅스 메모리 Management 관련글입니다. [3] file 박경태 2007.08.08 5311
1546 BIOS 를 통하여 PCI configuration space를 액세스하는 방법 지현구 2007.08.12 22873
XE Login