세그멘테이션에 관하여.

홍문화 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 강남쪽에서 하는 스터디 그룹있나요? [4] woos 2016.04.29 311
1564 스터디 내용중 mutex관련 질문 은두 2013.07.08 312
1563 [커널16차 A조]2주차 공지 및 참석인원 조사 [23] bigdu 2019.05.30 313
1562 커널 스터디 모임에 참여하고 싶습니다 [1] 꼬마툴 2016.05.05 323
1561 커널 B조 실시간 의견 공유를 위해 오픈채팅 개설합니다. [6] psionic 2016.04.25 338
1560 Kernel E팀 - 3주차 정리 노트 빈즈파덜 2016.06.22 344
1559 [커널 14차 D] 3주차 장소 및 진도 [9] 감기귤 2017.05.25 347
1558 [커널 15차 D팀] 7주차 스터디 장소 공지 [4] 라이더 2018.06.05 348
1557 ARMv7 아키텍쳐 메뉴얼 file 백창우 2011.08.03 353
1556 VFS inode에 대해서 돌고래너구리 2016.05.08 365
1555 [커널 15차 B팀] 스터디 장소 관련 [10] dudu 2018.04.26 371
1554 [커널 15차 A팀] 15주차(2018-08-04) 스터디 노트 코딩의노예 2018.08.06 372
1553 [커널 15차 B팀] 1주차 결과 [11] TUN 2018.04.29 377
1552 [커널 15차 B팀]4주차(2018-05-19) 스터디 결과 및 5주차(2018-05-26) 장소 공지 [8] HeyJin 2018.05.20 381
1551 [커널 15차 A팀] 3주차(2018-05-12) 스터디 노트 및 차주 장소 공유 [10] n5de 2018.05.12 382
1550 [커널 14차C] 9주차(20170708) 스터디 장소 공지 CLOCK 2017.07.06 383
1549 형상관리용으로 github에 저희팀이 사용할 리파지토리를 개설했습니다. [1] 미림 2016.06.06 393
1548 [커널16차 A조] 20주차(2019/10/26) 참석인원 조사 [10] bigdu 2019.10.21 407
1547 [커널 15차 A팀] 1주차(2018-04-28) 스터디 노트 및 결과 [3] n5de 2018.04.28 409
1546 13차 조건에 따라 cache_on 을 유보하는 코드 아루스 2016.06.25 415
XE Login