오늘은 메모리 구조에서 가장 복잡하다고 느끼는 세그먼테이션에 대해서 정리하겠습니다.

x86에서는 segmentation과 paging 기법을 이용하여 [가상 메모리] 를 만들고 프로그램들을 실행시키게 됩니다.

그림 1 Physical Address 변환 과정

 

가상 메모리는 세그먼테이션 과정을 거치고 페이징 과정을 거쳐서 실제 메모리가 나오게됩니다.

이때 세그먼테이션에는 Selector와 Offset이 들어가게 되는데 Selector는 이 챕터의 제목인 세그먼트 레지스터를 말합니다. Offset은 가상주소를 말합니다.

 

그냥 말로 서술하면 보기 힘드니 숫자를 붙여서 설명을 해 드리겠습니다.

 

세그먼테이션 과정

  1. 가상주소를 물리 주소로 바꾸려면 Selector(세그먼트 레지스터)와 Offset(가상주소)이 필요합니다.
  2. Selector는 16bit 이며 Descriptor Table의 Index를 가리킵니다. (그림 참조)
  3. Selector(세그먼트 레지스터)는 Descriptor table의 Segment Descriptor(그림 참조)를 가리킵니다.
  4. Segment Descriptor의 Base 주소와 가상주소를 합쳐서 선형 주소를 만들어 냅니다.

 

세그먼트 디스크립터 안의 내용은 굳이 설명하지 않아도 될 것 같네요. 다만 Base Address 0-15만 알면 될 것 같습니다. Base Address 필드는 실제 세그먼트를 통해 메모리에 접근할 때 더하는 값입니다. 아까 세그먼트 디스크립터의 Base주소와 가상주소를 더해서 32bit 선형 주소를 만든다고 했었죠? 그때 사용 되는 것입니다.

 

이제까지 저는 세그먼트 레지스터가 16bit라고 설명을 했지만 사실 80bit 입니다. 나머지 64bit은 왜 설명 안 했냐? 하신다면 했습니다. 위에서 말한 세그먼트 디스크립터가 바로 세그먼트 레지스터의 안 보이는 나머지 64bit입니다. 왜 80bit으로 만들었는지 잘 모르겠지만 많이 추측 하는 것은 세그먼트 레지스터는 자주 사용하고 자주 사용한다면 속도가 빠른 레지스터에 올리는 것이 더 낫다고 생각됩니다.

 

이젠 세그먼트 레지스터를 직접 보도록 하겠습니다. Ollydbg와 Windbg를 사용하겠습니다.

Ollydbg에서 열면 6개의 세그먼트 레지스터를 볼 수 있습니다. x86은 6개의 세그먼트 레지스터가 있습니다. 그 중 노란색으로 표시된 FS 레지스터를 보겠습니다.

FS는 Selector로 동작되며 INDEX, TI, RPL(그림 참조)필드로 이루어져 있는 것을 알 수 있습니다.

그래서 이진수로 표현하면 0000 0000 00111 0 11 가 나옵니다. 앞에 13비트는 테이블에서의 세그먼트 디스크립터 위치고 그 다음 1 비트는 GDT인지 LDT인지(인터넷 참고)를 나타내며 다음 2비트는 권한(인터넷 참고)을 나타냅니다. 중요한 것은 7번째를 가리키고 있다는 것입니다.

 

위 그림을 보시면 선택되어 있는 부분이 FS레지스터가 가리키는 세그먼트 디스크립터입니다. Ollydbg에 나온 값이랑 똑같네요.

 

 

여기까지 해서 세그먼트 레지스터와 선형 주소를 만드는 것을 보았는데요. 생각보다 어렵다고 느끼실 수도 있습니다. 하지만 조금만 공부하시고 더 자료를 찾아 보시면 정리를 완벽히 하실 수 있을 겁니다.

그럼 모두 즐공 하세요.

 

 

Bloger: moltak.net

'Programming > 이것저것' 카테고리의 다른 글

_Crt Debug Functions  (0) 2010.07.23
typeid 2  (1) 2010.05.25
x86 Register  (0) 2010.04.30
어셈블리어 점프 명령어  (0) 2010.04.29
Symbol  (0) 2010.04.24

+ Recent posts