[운영체제]10. Address translation

만두·2024년 1월 30일
0

운영체제

목록 보기
10/13

유저 프로그램의 프로세싱 단계

test.c라는 파일을 컴파일하여 test.o라는 이름의 object module을 생성한다. 이때 오브젝트 모듈들은 여러개로 나뉘어서 저장되는데 이것들을 linker가 모두 합쳐서 load module을 만들고 다른 C library에 있는 값들을 loader가 가져와서 메모리에 load한다.

이렇게 처음부터 다 가져와서 load하는 방법도 있지만, 다른 방법도 있다.

dynamic linking을 사용하는 것이다. 필요하면 그때마다 하나씩 Load한다.

즉, 프로그램이 실행될 때 필요한 라이브러리 코드를 직접 넣지 않고 참조만 포함하다가, 실행될 때 실제 코드로 대체된다.



Address binding

💡 Address binding : 프로그램 명령어와 데이터를 physical memory address로 associating하는 것. ![](https://velog.velcdn.com/images/eunseo120/post/d5aaf361-6310-457b-81de-26cb8b3b16a0/image.png)

이러한 address binding은 세 곳에서 일어날 수 있다.

  • Compile time binding
  • Load time binding
  • Execution time binding

Compile time binding

만약 메모리 위치가 컴파일 타임에 알게된다면, 절대 주소에 대한 절대 코드(absolute code with absolute addresses)가 생성이 된다.

즉, 프로그램이 컴파일 할 때 절대 주소가 결정되어 프로그램의 시작 주소가 미리 정해져 있는 것이다.

근데 만약 시작 주소가 변경되면 다시 컴파일해야만 한다.

Load time binding

Load time binding은 disk 에서 memory로 load할 때 binding 하는 것이다.

만약, 메모리 주소가 컴파일 타임에 알려지지 않는다면 상대 주소와 아무대나 적재 가능 코드(relocatable code with relative addresses)가 생성된다.

즉, 메모리에 로드 될 때 물리적인 주소가 결정된다.

컴파일러는 재배치 가능한 주소를 생성하며, 로더는 이를 실제 물리 주소로 변환한다.

시작 주소가 변경되어도 다시 load하기만 하면 된다.

Execution-time Binding

binding은 run time이 될 때까지 딜레이된다.

cpu가 주소를 언제 생성하든지간에 binding이 확인된다.

MMU와 같은 address mapping을 위한 하드웨어 자원이 필요하다.

최근의 OS는 이 방식을 사용하고 있다.

즉, 프로그램이 실행되는 동안 주소가 바인딩되므로 실행 시간에 실제 물리적 주소로 변환되는 것이다.

주소 바인딩이 실행시간에 발생하므로 메모리 내에서 프로세스 이동이 가능하다. 따라서 스와핑, 페이지 교체 등의 메모리 관리 기법과 잘 호환된다.



Memory Management Unit (MMU)

Logical address 논리적 주소

  • CPU에 의해 생성되는 주소이고 virtual address라고 부르기도 한다.

Physical address 물리 주소

  • memory unit에 의해 보여지는 주소이다.
  • 이렇게 cpu로부터 logical address(=virtual address)를 받으면 MMU에서 physical memory에서 시작 주소를 받아서 더하기 연산을 진행한 다음 physical address를 만든다.

MMU

logical address → physical address로 map하는 hardware이다.

Simple MMU schema

relocation register의 값을 받아서 cpu에서 생성된 모든 주소와 더한다.

logical address를 다루는거지 physical address를 볼 수 있는건 절대 아니다.



Dynamic Loading

  • Routine은 이것이 불리기 전까지 load되지 않는다.
  • memory-space의 효율성이 좋아진다.
    • 즉, 사용되지 않는 routine은 전혀 Load되지 않는다.
  • 많은 양의 에러 핸들링 코드가 필요할 때 유용하다.
    • 에러는 빈번하게 발생하지 않기 때문이다.
  • Load할 때마다 매번 동일한 address가 비어있지 않다.
    - 어디든지 load될 수 있기 때문에 dynamic linking이 필요하다.



Dynamic Linking

execution time이 될 때까지 linking을 미룬다.

그리고 라이브러리를 필요로 하는 모든 프로세스는 메모리에 있는 복사본 하나로 충분하다.

이렇게 printf라는 라이브러리를 공통으로 사용하므로 C library 부분을 메모리에 올려두고 동일한 주소를 linking할 때 채워넣어서 사용한다.


메모리 가상화는 제한된 직접적인 실행(LDE)와 효율성과 제어성 면에서 유사한 전략이다.

메모리 가상화에서 효율성과 제어성은 하드웨어 지원에 의해 달성된다.

  • e.g., registers, TLB(Translation Look-aside Buffer)s, page-table



Address Translation

하드웨어는 virtual address → physical address로 변환한다.

  • 요구되는 정보는 사실 physical address에 저장되어있다.

OS는 하드웨어를 설정하기 위한 키포인트롤 포함하고 있어야 하나.

  • OS가 메모리를 관리해야 적절히 개입할 수 있다.
  • 위치가 해제되었고 사용중인 곳을 track 추적해야한다.

가정

  • 유저의 주소 공간은 contiguously in physical memory 에 위치해야한다.
  • 주소 공간의 크기는 실제 메모리 주소보다 작아야 한다.
  • 각 주고 공간은 정확히 같은 크기이다.

예제

void func()
		int x;
		...
		x = x + 3; // this is the line of code we are interested in
  • Load a value from memory
  • Increment it by three
  • Store the value back into memory

x의 주소가 ebx 레지스터 안에 위치해있다고 가정한다.

  • Load the value at that address into eax register
  • Add 3 to eax register
  • Store the value in eax back into memory

address 128에서 명령어를 Fetch

명령어 execute

그다음 명령어 132에서 fetch

execute



Relocation Address Space

주소 공간 재배치

OS는 주소가 0이 아닌 physical memory에서 프로세스를 다른 곳에 배치하기를 원한다.

시작 위치인 base register값을 받아서 mmu에서 매핑할 수 있고, bounds register를 통해 끝나는 위치를 계산할 수 있다.



Dynamic Relocation

프로그램이 실행을 시작할 때, OS는 실제 메모리 어디든지 프로세스를 적재해야한다고 결정한다.

physical address=virtual address+basephysical \space address =virtual \space address +base

모든 virtual address는 bound보다 작아야 하고 양수여야 한다.

0virtual address<bounds0 \leq virtual \space address < bounds

128에 있는 명령어를 fetch하기 위해 base 값을 더해 실제 주소를 알아낸다.



Bounds Register의 두가지 방법

address space의 크기를 나타내는 방법과

physical address의 끝을 나타내는 방법이다.


메모리 가상화를 위한 OS 문제

운영체제는 base and bounds 접근법을 구현하기 위해 액션을 취해야한다.

세가지 중요한 분기점(juncture)이 있다.

  • starts running
    • 시작할 때 물리 메모리의 주소 공간에서 공간을 찾아야 한다.
    • free list : 사용되지 않는 physical memory의 범위를 적은 리스트이다.
  • terminated
    • 사용중인 메모리를 해제해야 한다.
    • 메모리 해제하면 사용할 수 있으니까 다시 free list에 넣으면 된다.
  • switch occurs
    • base와 bounds 레지스터 값을 저장하고 보관해야 한다.
    • process structure(=process control block(PCB))에 저장한다.
    • 즉, 프로세스 A에서 B로 Context Switching이 일어날 때 A의 base, bounds 레지스터 값을 process A PCB에 저장하는 것이다.

  • Multi Programming 방식으로 memory 사용하므로 다양한 프로그램 존재 가능
  • 주소 변환의 가장 간단한 방법은 프로그램이 연속적으로, 통째로 메모리 공간에 적재될 때. 시작주소(base Register)만 알고 있으면 MMU가 덧셈으로 가능

Dynamic(Hardware base) Relocation

  • CPU가 요청하는 virtual address + base(시작 주소) → physical address
  • 0virtual addrss<bounds0 \leq virtual \space addrss < bounds

128번째에 mov 명령어 수행하려면 프로세스 입장에서는 128번이지만 실제 프로그램이 메모리 0번째에 저장되는 건 아니다. 예를 들어 32KB 이 위치에 시작된다고 가정하면 +32만 해주면 된다.

Stack 에 있는 값(3000)을 접근하려면 마찬가지로 base Register 값 더한 실제 메모리 주소에서 가져와야 한다.

OS Issues for Memory Virtualizing

  • os가 해야할 일이 있다.
  • base, boudns register만 있으면 주소 변환이 쉽고, 메모리에 통째로 적재하기 쉽다.
  • 하지만 os가 해야하는 일도 있다.
    • starts tunning 할 때 : address space → physical 에 적재하는 작업
    • termintated : 빼내는 작업
    • switch occurs : 문맥교환할 때(time sharing)
  1. When a Process Starts Running

    프로세스를 위한 주소 공간을 마련해줘야함.

    어디가 비어있는지, 어디가 쓰고 있는지 알아야함.

    비어있는 공간만 따로 모아둔 걸 Free List라고 한다.

    쓸거면 Free list에서 찾아서 쓰고 이 리스트에서 지우면 됨.

  2. When a Process Is Terminated

    • Free List에 대한 업데이트 필요
  3. When Context Switch Occurs

  • a가 현재 실행중. base, bounds register가 있음.
  • 그때 b를 실행하려고 함. (cpu scheduling에 의해 문맥교환)
  • b의 base, bounds register가 필요함.
  • 그러면 A의 레지스터 값을 저장해두고 있어야함.
  • 그럼 어디에 저장해놓을까? 각 프로세스마다 PCB가 있는데 거기다 저장해둔다.
profile
아무것도 모르는 말하는 감자 입니다

0개의 댓글

관련 채용 정보