세그멘테이션에 관하여.

홍문화 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 2193
1565 안녕하세요, 반장입니다.^^ [12] file 조은지 2010.04.05 7620
1564 powerpc 레지스터 용도에 대한 결과 [1] 김종화 2007.05.19 7581
» 세그멘테이션에 관하여. [12] 홍문화 2011.07.22 7531
1562 메모리 모델에서 페이지 디렉토리와 페이지 테이블 [3] 무명 2011.05.01 7432
1561 [ARM중] . (점)과 : (라벨)을 이용한 주소 변환 [7] file 홍문화 2011.10.05 7426
1560 리눅스 커널소스 분석 사이트 [2] 이 종인 2012.05.08 7394
1559 ARM system developer's guide 요약본 [1] file 이수연 2007.11.11 7372
1558 이번주(10/23) 스터디장소 변경합니다. [3] 서기원 2010.10.23 7363
1557 [잡담] 한주의 시작입니다.. ^^ [4] 홍순민 2010.04.05 7339
1556 asmlinkage의 의미 [4] 홍문화 2011.04.12 7323
1555 설치 & 컴파일 방법 [5] 최문규 2010.06.20 7310
1554 첫째날에 공부한 내용 정리한번 해보는게 어떨까요?? 여러분의 의견을 묻습니다. [8] file 김정수 2007.02.26 7255
1553 안녕하세요~ [4] 조선근 2010.11.11 7248
1552 mini USB 케이블을 수배합니다. [1] 권기봉 2010.04.03 7238
1551 아키텍쳐에 관련된 내용입니다. [6] file 원민수 2007.02.25 7234
1550 uboot 관련소스 및 s3c2440 data sheet file 이수연 2007.11.19 7228
1549 엇 너무 조용하네. [2] 서정민 2010.04.05 7223
1548 [제안] 커널 스터디 병행 관련 제안해 봅니다. [12] 장병남 2010.04.12 7216
1547 asmlinkage void __init start_kernel(void) [7] 김태훈80 2008.02.02 7205
1546 setup.S 전반부 정리 자료 [1] file 이종우 2007.05.19 7190
XE Login