운영체제 15 주소 변환의 원리

zh025700·2022년 5월 22일
0

운영체제

목록 보기
9/20

운영체제

15) 주소 변환의 원리

주소 공간의 사이즈

  • 메모리는 바이트 배열
    • 각 프로세스에 대한 주소 공간의 허용 크기는 컴퓨터 아키텍처에 의해 결정

만약 컴퓨터가 32비트 구조라면, 각 프로세스는 2^32 바이트의 주소 공간을 가질 수 있다.

  • N-비트 구조에서, CPU의 레지스터는 N 비트를 저장 가능
  • 메모리 주소는 레지스터에 저장된 값으로부터 얻어짐.
    • 레지스터의 값이 메모리로부터 로드됨
  • 그래서 N bit 구조이면, 2^N개의 메모리 주소를 가진다.
  • 주소 1개당 1byte의 크기를 지니니
    EX
 32 bit 구조에서 주소의 범위는 0~(2^32-1)
 주소공간의 크기 = 2^32 바이트 = 4기가
 64 bit 구조에서 주소의 범위는 0~(2^64-1)
 주소공간의 크기 = 2^64 바이트

메모리 효율성, 제어를 통한 가상화

  • 메모리 가상화

    • 프로그램이 자신만의 개인적인 메모리가 있다는 착각을 준다.
    • LDE와 비슷한 전략을 취함.
  • address translation

    • 하드웨어가 가상 주소를 실제 주소로 변경
    • OS가 정확한 변환을 해 메모리를 관리
  • 메모리 가상화에서, 효율성과 제어는 하드웨어의 지원을 통해서

    • 레지스터, TLB, 페이지 테이블

주소 전환

  • 하드웨어가 가상 메모리에서 실제 메모리로 변환을 함

    • 실제 주소에 원하는 정보가 있으니
  • 하드웨어를 설정하려면 OS가 핵심 지점에 개입해야함.

    • OS는 메모리 관리에 현명하게 개입해야함
    • os가 하드웨어에 도움을 받아!

가정

  1. 주소 공간은 실제 메모리에 연속적으로 배치
  2. 주소 공간의 크기는 실제 메모리 사이즈보다 작다.
  3. 각 주소 공간의 크기는 같다.

Ex: 주소 변환

C 코드

void func(){
    int x = 3000;
    x = x + 3; //우리가 관심 있는 코드
}
  • 메모리에서 값을 LOAD
  • 값을 3증가
  • 다시 메모리에 STORE

프로세스 관점

  • 프로세스 관점이라 맨 상위 주소에 OS가 아닌 코드가!!
    • 실제론 OS가 상위 메모리에 있고 밑에 주소에 해당 프로세스가 들어가있다.

사진은 피피티 9쪽

  1. 인스트럭션을 128로 부터 fetch
  2. 인스트럭션 실행, 15kb로부터 값 로드
  3. 132로부터 인스트럭션 fetch
  4. 인스트럭션 실행
  5. 135로부터 인스트럭션 패치
  6. 실행, 15kb에 저장

address space(주소공간) 재배치

  • 프로그램의 관점에서, 주소가 0으로 시작한다.
  • 메모리 가상화를 위해, OS는 실제 메모리 어딘가에 프로세스를 위치해야함.
    • 어떻게 transparent하게 할당?
    • 어떻게 주소가 0부터 시작한다는 환상을 줌?

base bound 레지스터

  • 원하는 위치에 주소 공간을 배치할 수 있게 함.

    • 배치와 동시에 프로세스가 오직 자신의 주소 공간에만 접근하는 것을 보장
  • 이를 통해 각 프로그램은 주소 0에 탑재되는 것처럼..

  • MMU가 제공한다.

    • 하드웨어임!!
  • base 레지스터

    • 해당 프로세스 주소의 시작점을 알려줌
  • bound 레지스터

    • 해당 프로세스 주소의 끝나는 지점을 알려줌
      • 메모리를 보호하기 위해, protection
      • 프로세스가 바운드보다 크거나 음수인 주소를 참조하면 예외 발생이 댐
      • 범위를 확인!!

동적(하드웨어 기반) 재배치

  • 프로그램이 동작을 시작하면, OS는 프로세스가 실제 메모리 어디에 load될 지 결정

    • 베이스 레지스터를 설정
      • OS만 접근 가능, PCB에 해당 값이 저장되어 있어 OS가 관리
      • 실제 주소 = 가상 주소 + base
        • 하드웨어는 이를 통해 실제 주소를 생성
    • 모든 가상 주소는 바운드보다 크지 않고, 음수가 아님.
      • 0<= 가상주소 < 바운드
  • 주소 공간을 실제 메모리 어디에나 위치할 수 있게

  • 프로세스는 자신의 고유한 주소 공간에만 접근할 수 있게 보장

  • base,bound 레지스터는 오직 OS만 접근이 가능함!!

EX 재배치, 주소 변환

128:movl 0x0(%ebx),%eax
  1. 128주소에서 인스트럭션 fetch
    • 하드웨어가 주소를 얻을 때 base레지스터의 값에 PC를 더해 실제 주소를 얻는다
    • 32896 = 128 + 32kb(베이스,2^10 * 2^5 = 2^15)
  2. 인스트럭션 실행
    • 15kb에서 값을 load
    • 47kb = 15kb+32kb(베이스) 에서 가져옴

주소변환: 가상 주소에서 실제 주소로

  • 하드웨어는 프로세스가 참조하는 가상 주소를 받아, 실제 주소로 변환한다.
  • 이런 재배치는 실행 시 일어남, 프로세스가 시작한 이후에도 주소 공간을 이동 가능하기 때문에, 동적 재배치라고 불림

EX 주소 변환

  • 주소 공간 4kb, 16kb에 프로세스가 fetch(이 말은 베이스가 16kb)16384
  • 그럼 바운드는 20kb(왜? 주소 공간이 4kb니깐)20480
가상 주소실제 주소
016kb+0= 16kb
1KB16kb+1kb= 17kb
300016kb+3000 = 19384
440016kb+4400= 바운드를 지나침 = 폴트

하드웨어 지원

  • 하드웨어는 베이스,바운드 레지스터를 수정할 특별한 인스트럭션을 제공한다.
    • OS가 특별한 프로세스가 동작할 때 이들을 바꾸는걸 허락(커널 모드)
  • CPU는 특정 상황에 대한 예외를 생성할 수 있어야 한다.
    • 유저 프로그램이 비정상적 메모리 접근을 시도할떄(out of bound 같은)

MMU

  • 전기 하드웨어 회로로 구성된 cpu의 일부
  • 가상 주소가 들어오면 base와 더해 조건 체크하고 실제 주소로 내보냄

OS 이슈

  • 베이스, 바운드 방식을 위해 OS는 반드시 개입해야한다.

3가지 시점(4번째는 뭐지)

  1. 프로세스가 생성될 때(동작을 시작할 때)
    • 실제 메모리에 주소공간을 넣을 공간을 찾는다.
      • 주소 공간이 실제 메모리보다 작고, 크기가 일정하다는 가정이 있으면 쉽게 처리 가능
        • but 실제 안그럼
  2. 프로세스가 종료할 때
    • 프로세스가 사용하던 메모리를 회수해 다시 사용가능하게 해야함
  3. context switch가 일어날 때
    • base bound 쌍을 저장, 복구해야한다.
  4. 프로세스가 범위 밖 메모리에 접근하려고 할 때
    • 예외 핸들러 or 호출될 함수를 제공해야한다.

프로세스가 생성될 때

  • OS는 새 주소 공간을 찾아야한다.
    • free list: 사용하지 않는 실제 메모리 범위 리스트

OS가 freelist를 살핀다.

프로세스가 종료될 때

  • OS는 free list에 메모리를 돌려놔야함.

context switch가 일어날 때

  • OS는 베이스, 바운드 쌍을 저장하고 복구해야한다.
    • CPU엔 한 쌍의 베이스 바운드 레지스터만 존재해야하기 때문에.
    • 각 프로세스마다 다른 실제 주소에 저장되어 있기때문에 모두 값이 다름
    • 프로세스 구조체 or PCB에 저장한다.

과정

  1. os가 프로세스 실행 중지
  2. OS가 현재위치에서 새 위치로 주소 공간 복사
  3. OS는 PCB에 저장된 베이스를 갱신해 새 위치를 가리키도록
    => 프로세스가 다시 실행되면 새로운 베이스에서 실행됨

이거 적용된 제한적 실행 원리 알아야할듯...?

요약

  • 주소 변환
    • 주소 변환은 프로세스에게 투명하다
    • OS는 프로세스로부터 메모리 접근을 통제 가능
    • 주소 공간의 바운드로 접근을 보장한다.
    • 하드웨어의 지원으로 효율성이 보장됨
profile
정리

0개의 댓글

관련 채용 정보