Segment Register

dandb3·2023년 4월 28일
0

이것저것 TMI

목록 보기
8/17
  • 인텔 8086의 경우 16비트 단위로 동작한다.

  • 즉, 16비트 => 64KB의 메모리만 사용가능.

  • 하지만, 실제 물리 메모리인 1MB(20비트)까지 지원하기 위해서 세그먼트 레지스터를 사용하기 시작.

  • 세그먼트 레지스터?

    • 16비트 레지스터.
    • CS, DS, ES, FS, GS, SS가 있다.
    • 각 세그먼트 레지스터의 값은 해당 세그먼트의 시작 주소를 나타낸다.
      • 시작 주소값은 0x10으로 나누어 떨어져야 한다.
      • 정확한 시작 주소는 << 4만큼 shift해야 한다.
      • shift 후에 offset값과 합하여 주소에 접근할 수 있다. (ex - CS(Code Segment)와 IP(Instruction Pointer)의 조합 -> (CS << 4) + IP => 물리 메모리 주소!)
  • 이런식으로 20비트까지 표현할 수 있게 되었다.

  • 하지만 offset을 16비트 레지스터로 표현하기 때문에 한 segment의 최대 크기는 64KB에 해당한다.

  • virtual memory기법이 적용되었는지는 잘 모르겠음. 애초에 base address + offset 형식이니까 충분히 사용하기 좋은 형태이긴 하다.

  • 내 생각에는 사용되었을듯. 개별 프로그램마다 세그먼트 별로 0부터 시작해서 메모리를 사용하고, 실제 물리 메모리에 매핑될 때에는 segment register로 매핑되서 사용하면 공유 메모리도 충분히 구현하기 쉽고 여러모로 장점이 많다.

  • 어셈블리어에서의 사용

    • DWORD PTR ds:0x... 이런식으로 사용되던데 말 그대로 ds 레지스터의 시작 주소부터 0x...의 offset을 가진 지점에서의 값을 DWORD로 갖고오겠다는 뜻임.
  • 지금도 세그먼트 레지스터는 16비트이다. 이전 아키텍쳐와의 호환성 때문이라는듯.

  • 현대의 아키텍쳐는 flat address space model을 사용하므로 segmentation은 사용하지 않는다. 그러므로 ds:0x...이라고 해도 사실상 그냥 0 + 0x...이라고 생각하면 될 듯.

profile
공부 내용 저장소

0개의 댓글