Notice
Recent Posts
Recent Comments
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

topcue

[OS] Address Space & Traslation 본문

Operating System

[OS] Address Space & Traslation

topcue 2021. 9. 3. 16:59

The Abstraction: Address Spaces

Early Systems

예전에는 메모리 관점에서의 컴퓨터가 매우 단순했다.

OS는 주소 0x0부터 자리하고 있고 프로세스는 단 하나만 돌아가므로, 메모리에서 OS 바로 아래 위치했다.

Multiprogramming and Time Sharing

프로세스들이 run할 준비가 되면 OS가 switch 해주는 방식이 multiprogramming이다. 이후 여러 프로세스를 동시에 사용할 수 있도록 해주는 time sharing이 등장했다.

하지만 초기에는 메모리 context swtiching을 위해 프로세스의 정보를 DRAM에 저장했기 때문에 매우 느렸다. 그래서 하나의 메모리를 공유하는 방식을 적용했다.

그래서 위 그림과 같이 프로그램들을 메모리 내에 동시에 상주하게 했다.

Address Space

프로세스의 주소 공간(address space)에는 실행 중인 프로그램의 모든 메모리 상태가 담겨 있다.

여기서는 CODE, HEAP, STACK만 가지고 있다고 가정하자. CODE는 크기가 static 하므로 맨 위에 위치하고, 그 뒤에 HEAP이 있으며 STACK은 맨 아래에서부터 거꾸로 올라온다.

Virtualizing memory

프로세스를 여러 개 실행하면 그 프로세스들은 모두 자기가 0x0번지부터 메모리를 할당받았다고 착각한다. 당연히 이 0x0번지는 물리적 주소가 아닌 가상의 주소다.

이처럼 Virtualizing에 의해 모든 프로세스들이 주소와 공간을 할당받지만 실제 물리적 주소나 메모리가 아니다.

예를 들어 C언어로 작성한 프로그램이 출력하는 포인터의 값(주소)는 모두 virtual memory다.

CODE, HEAP, STACK의 주소를 출력하는 프로그램을 실행하면, 프로세스를 여러 개 실행해도 주소는 각 영역끼리 주소는 같게 나온다.

$ ./a.out
Code address  : 0x1234
Heap address  : 0x5678
Stack address : 0x9876
$ ./a.out
Code address  : 0x1234
Heap address  : 0x5678
Stack address : 0x9876

Goal

Transparency: Virtualize의 목표. 프로그램이 virtualize 된 게 아니라 물리 주소에 있다고 착각하는 성질.

Efficiency: OS는 time, space 관점에서 최적화되어야 하며, 시간 효율을 위해 OS는 TLB와 하드웨어에 의존해야 한다.

Protection: OS는 프로세스를 안전하게 보호해야 하며, isolation으로 이룰 수 있다.

Mechanism: Address Translation

  • Control & Efficiency

ControlEfficiency 두 가지가 현대 OS의 주요 목표이다.

CPU 가상화를 위해 LDE라는 mechanism에 대해 다루었었다. LDE는 프로그램을 H/W 위에서 직접 실행하겠다는 개념인데, 여러 가지 문제가 있어서 syscall이나 time interrupt 등의 개념을 도입했다.

만약 중요한 순간에 interposing이 들어온다면, OS는 H/W를 control 할 수 있어야 한다.

  • Address Translation

LDE를 위해 Address Translation(= Hardware-based address translation)을 도입했다. address Translation은 H/W가 virtual address를 physical address로 바꿔주는 것을 의미한다.

  • Assumptions
  1. address space가 physical memory에 연속적으로 위치한다고 가정한다.
  1. address space size가 physical memory size보다 작다고 가정한다.
  1. 각 address space의 size가 모두 같다고 가정한다.
  • Transparent

프로세스가 메모리에 올라가 16KB를 사용한다고 가정하자. 0KB에 Code가, 15KB에 Stack이 위치한다. (물론 이 0KB는 Physical Memory가 아닌 Virtual Memory이다.)

실제 physical memory에서는 32KB부터 16KB를 할당했을 수도 있지만, 프로세스는 0KB 번지부터 시작한다고 착각하는데 이것이 Transparent다.

  • Relocate

Relocate는 physical memory에 virtual memory를 할당하는 것이다.

  • Dynamic Relocation

Dynamic relocation을 위해 base and bounds라는 개념이 등장했다.

CPU는 base register와 bounds register를 가지고 있다.

프로그램이 처음 컴파일되면 0번지에 로드 된다고 인식한다.

프로그램을 실행하면 OS는 base register를 이용해 물리 메모리 중 어디에 load할지 정한다.

Address Translation

virtual memeory를 이용해 physical address를 찾는 것을 Address Translation이라고 한다.

physical address = virtual address + base

프로세스에 의해 만들어진 모든 주소는 Virtual memory이다.

예를 들어 128번지에 있는 mov eax, 0 instruction을 실행한다고 가정하자. 그럼 하드웨어가 virtual addr(128) + base(32KB)인 physical addr을 찾아 fetch 한다. 이후 프로세스가 해당 명령어를 execute 한다.

address translation은 프로그램이 실행할 때 동적으로 이루어지므로 dynamic relocation이라고 부른다.

  • Bounds register

그럼 bounds register는 protection을 위한 레지스터다.

프로세스가 할당된 주소를 넘어가는지 bounds register로 확인하는데, 만약 넘어가면 CPU가 interrupt를 발생시키고, 프로세스가 종료된다.

address space size와 physical address를 알고 있으므로, VA + base가 address space 인지 확인하는 방법과, 일단 더하고 그 값이 PA 인지 확인하는 방법이 있다. 보통 전자를 선호한다.

  • MMU

이런 address translation을 도와주기 위한 칩셋 MMU(Memory Management Unit).

Hardware Support: Summary

지금까지 살펴본 기능들을 위해 Hardware Support 관점에서 필요한 것들이 많다.

CPU에는 kernel mode 인지 user mode 인지 나타내는 flag 값인 Processor Status Word가 있다.

하드웨어는 base bounds registers를 가지고 있으며, base로 주소를 구하고 bounds로 검사를 한다.

당연히 base와 bounds register를 조작하는 instruction들은 privileged하다.

OOB(Out of Bounds)가 발생하면 CPU는 exception을 발생시킨다.

그러면 CPU는 실행 중이던 user program을 멈추고 OS가 OOB exception handler를 실행하도록 한다.

이것과 비슷하게 user mode에서 base, bound register 값을 변경하려 하면 CPU가 exception을 발생시키고 OS가 "tried to execute a privileged operation while in user mode" handler를 실행하도록 한다.

Operating System Issues

Virtual memory를 구현하기 위해 하드웨어뿐만 아니라 OS의 도움도 필요하다.

1. free space 찾기

프로세스가 생성되면 OS는 free list라는 구조체를 이용해 메모리를 할당할 공간을 찾는다. (아까의 가정으로 프로세스 메모리 크기를 알고 있다.)

2. 종료된 프로세스 처리

정상 종료, 강제 종료 등의 이유로 종료된 프로세스가 있던 메모리를 나중에 사용할 수 있도록 OS가 free 해야 한다.

3. context switch 할 때 base bounds register도 신경 써야 한다.

각 CPU마다 physical memory가 다르므로 base bouns register를 잘 save 하고 resotre 해야 한다.

OS가 프로세스 실행을 멈추기로 결정하면, base bouns register 값을 각 프로세스의 PCB 같은 메모리에 저장하고, 다시 실행할 때 잘 가져와야 한다.

4. exception handler 제공

OS는 exception을 handle 할 수 있어야 한다. 다른 프로세스가 bound 안으로 들어오려 하면 CPU가 예외 처리를 하고, 그러면 OS가 exception을 handle 해야 한다.

  • Timeline of LDE Protocol with Dynamic Relocation

Summary

LDE 개념의 확장을 위해 virtual memory에서 사용하는 address translation이라는 mechanism을 살펴보았다.

Base-and-Bounds 가상화는 꽤 효율적이고 Protection을 잘 제공한다.

하지만 Internal fragmentation이 심하다는 단점이 있다.

그래서 Segmentation을 이용해 base bound를 구현할 것이다.


'Operating System' 카테고리의 다른 글

[OS] Free Space  (0) 2021.09.03
[OS] Segmentation  (0) 2021.09.03
[OS] Scheduling  (0) 2021.09.03
[OS] LDE  (0) 2021.09.03
[OS] Process  (0) 2021.09.03
Comments