728x90

마치 구름이 낀 것 마냥 앞이 보이지 않는다.

가정: 프로세스 주소 공간 전체를 Memory에 loding했다.
base, bound 레지스터로 OS는 Process를 Physcial Memory의 다른 부분으로 쉽게 재배치할 수 있다.
Stack, Heap 사이에 사용되지 않는 큰 공간이 존재한다. not in use 공간 때문에 낭비가 심하다. Address Space공간이 Physcial Memory보다 큰 경우 실행이 매우 어렵다.


Segmentation

대용량 주소 공간을 어떻게 자원할까?
↑ 4GB, 32GB bit 주소 공간을 상상해보자.
프로그램은 단지 수 MB만 사용함에도 불하고 주소 공간 전체에 메모리 LOAD 어떻게 할까?
Basic idea: Instead of having just one base and bounds pair in our MMU, why not have a base and bounds pair per logical segment of the address space?

  • Segmentation 논리
  • 각각의 address space 단 한쌍의 base ,bound 레지스터를 이용해서 표현하는 것이 아닌, address space에 존재하는 logical segement마다 base랑 bound 레지스터 pair를 할당하는 것

A segment is just a contiguous portion of the address space of a particular length.

Segmentation을 사용하면 OS는 각 Segment를 물리 메모리의 각기 다른 위치에 배치할 수 있고, 사용되지 않는 가상 주소 공간이 물리 메모리를 차지하는 것을 방지할 수 있다.

1960년초 아이디어: MMU 안에 오직 하나의 base, bound 쌍이 존재 X, address space의 논리적인 segement마다 base bound 쌍이 존재한다.

세그멘트 위반(segment violation) or 세그멘트 폴트(segment fault) : 프로세스가 자신의 주소 범위를 넘어 잘못된 접근을 하여 하드웨어가 트랩을 발생시키고 OS는 프로세스를 종료시키는 것

우리가 기준으로 삼는 address space에는 CODE, STACK, Heap 세 종류의 Segment가 있고, 실제 OS에서는 여러개의 segment가 있다.

Ex) 주소 공간을 물리 메모리에 배치하려고 한다. 각 세그멘트의 base와 bound 상을 이용하여 Segment들을 독립적으로 물리 메모리에 배치할 수 있다.

64KB의 물리 메모리에 3개의 Segment와 OS용으로 예약된 16KB 영역이 존재한다.

사용 중인 메모리에만 Physical space이 할당된다.

Address translation

가상 주소 100번지를 참조한다고 가정하자. 가상 주소 100번지는 Code Segment에 속한다. 참조가 일어나면 하드웨어는 base 값에 이 Segment의 Offset을 더해 물리 주소를 만든다.

↑ ( offset(100) + start address of code segment (32KB) = 100 + 32KB = 32868 )

가상 주소 4200의 Heap을 살펴보자. 가상 주소 4200에 Heap의 base 34KB를 더하면 물리 주소 39016이 나온다. 이 주소는 올바른 주소가 아니다. 먼저 Heap 안에서의 offset를 알아한다. Heap은 가상 주소 4KB(4096)에서 시작하기 때문에 offset은 실제로 4200-4096 = 104이다.

↑ ( offset(104) + start address of code segment (34KB) = 104 + 34KB = 34920 )

SUMMARY

접근하고자 하는 주소에 접근하는 방법

virtual address space 상에서 각 segment 시작 부분에서 접근하고자 하는 주소까지의 offset을 먼저 구해야함.

offset + 접근하고자 하는 segment의 base regset 값 = 실제 Physical address

Segment 구분하는 방법 2가지:


Explicit approach( address에 segment 정보를 추가하는 방법 )

가상 주소의 최상위 몇 비트를 기준으로 주소 공간을 여러 segement를 나누는 것을 말한다.
주소 공간을 Segment로 나타내기 위해서 최상위 2비트를 이용한다.
00→ Code segment
01→Heap segment
11→Stack segment
나머지 비트는 offset으로 사용한다.

이 Virtual address.는 14bit짜리다.

↑ The virtual address of 4200 → 4200 이진 숫자 01 0000 0110 1000
By adding the base register to the offset, the hardware arrives at the final physical address.
offset은 bound 검사도 쉽게 만든다.
offset이 bound보다 작은지 여부만 검사하면 된다. 그렇지 않으면 주소가 잘못된 것이다.
base와 bound 쌍을 배열 형식으로 저장할 경우 (segment당 하나의 항목), 원하는 물리 주소를 얻기 위하여 다음과 같은 작업을 하게 된다.

Implict approach

주소가 어떻게 생성되었나를 관찰하여 Segement를 결정한다. 만약 주소가 PC(program counter)에 생성되었다면 (즉, Instruction fectch) 주소는 Code segment에 있을 것이고, Stack 혹은 base Pointer에 있다면 Stack segment에 있는 것이다. 나머지 경우에는 Heap영역에 있을 것이다.

What About The Stack?


Stacks grow backwards → translation must proceed differently.
negative offset < offset - Stack_Max_Szie이 나온다.

순방향 1, 역방향 0을 표시하는 1bit 추가.

 

이 예에서 가상주소 15KB에 접근하려고 가정해보자. 이 주소는 물리주소 27KB에 매핑되어야 한다. 이 가상 주소를 이진 형태로 바꾸면 11 1100 0000 0000이 된다. 하드웨어는 상위 2비트 11를 사용하여 세그멘트를 지정한다. 이를 고려하면 3KB offset 이 남는다. 올바른 음수 오프셋을 얻기위해서 3KB에서 Segment의 최대 크기를 빼야한다. 이 예에서는 4KB이고 3KB-4KB = -1KB이다. 이제 Base(28KB)에 더하면 올바른 물리 주소 27KB를 얻게 된다. Bound 검사는 음수 Offset의 절대값이 Segment의 크기보다 작다는 것을 확인하여 계산할 수있다.

Support for sharing


Protection bit

메모리 절약을 위해서 때로는 메모리 세그먼트를 공유한다. 코드 공유가 일반적이고, 공유를 지원하 위해서 Protection bit를 하나 추가하여 지원한다.

By setting a code segment to read-only, the same code and be shared across multiple processes.

The OS secretly shares memory which cannot be modified by the process.

다음 장 내용:

OS Support

위와 같은 방식으로 이용한다면 여러 군데 듬성듬성 not in use 공간이 생기고 이는 OS가 재정렬, 재집합을 해준다. 이에 대한 내용은 다음장에서 설명해준다.

반응형

+ Recent posts