세그멘테이션에 관하여.

홍문화 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 2201
1745 setup.c 파일의 cacheid_init 함수 [1] file HyunGyu 2013.11.05 72373
1744 Vol.1의 CMPS ~ CVTPD2PS 입니다. 늦어서 죄송합니다. file 지현구 2007.03.10 64225
1743 as86(1) - Linux man page 입니다. 김민석 2010.04.30 36679
1742 lilo.c에서 !! 관한 토론? [6] 오시리스 2011.07.25 34354
1741 [ARM중] 1차 분석 복습 [5] file 홍문화 2011.08.08 33713
1740 ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM (미완성) 구본규 2013.10.15 32792
1739 fork() 함수가 리턴을 두번하는 이유 설명 [2] 커널B조 2016.05.07 30234
1738 task_struct 구조체입니다. [1] file 아폴로 2013.04.30 29857
1737 ARM 프로세서 모드 [7] 홍문화 2011.06.08 26499
1736 BIOS 를 통하여 PCI configuration space를 액세스하는 방법 지현구 2007.08.12 22872
1735 파이프라인과 익셉션의 관계 관련 블로그 주소입니다. 이한울 2012.05.26 22081
1734 buildroot 사용법 [1] 구본규 2012.07.20 20243
1733 [x86] 스터디때 나왔던 cpu_dev 문제 [2] file pororo 2012.02.19 18434
1732 페이지 테이블에 주소 변환 정보가 채워지는 원리 [16] 홍문화 2011.07.12 16326
1731 odroid bootlog 입니다 박장운 2010.08.14 15560
1730 명령어 정리 - 늦어서 죄송.. 송형주 2007.03.09 14528
1729 Linux booting 과정 (start_kernel() 함수 전까지) 관련 참고자료들 모음 file 지현구 2007.04.27 14328
1728 분석 환경 구축 실습 [11] file 권석민 2013.05.19 14204
1727 [x86] 가족번호 [2] pororo 2012.02.27 13914
1726 LVM에 대해 간략하게 정리했습니다. [2] file 조성진 2013.05.07 13825
XE Login