메모리 주소

라마·2023년 7월 30일

운영체제

목록 보기
27/32

※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.

물리 주소와 논리 주소

메모리는 오직 주소값으로만 접근할 수 있습니다.

이 주소는 2가지 관점으로 바라볼 수 있는데, 바로 물리 주소와 논리 / 가상 주소 입니다.

  • 물리 주소 ( physical address ) : 하드웨어 관점

    • 물리 메모리 ( RAM ) 에 매겨진 주소
    • 하드웨어에 의해 고정된 메모리 주소
    • 0 에서 시작하여 연속되는 주소 체계
    • 메모리는 시스템 주소 버스를 통해 물리 주소의 신호를 받음
  • 논리 / 가상 주소 ( logical address / virtual address ) : 프로세스 관점

    • CPU 가 프로세스를 실행하는 동안 다루는 모든 주소는 논리 주소
    • 프로세스 내에서 매겨진 상대 주소
  • 메모리 접근 시 상대 주소를 사용하면 절대 주소로 변환해주어야 함 ( MMU 가 해줌 )

일반적인 프로세스는 메모리 위에 물리 주소의 형태로 올라와야 합니다.

만약 같은 주소로 변수 값이 올라와야 하는 상황이 온다면..

→ 로드가 되지 않거나, 값이 덮어씌워지거나 둘중 하나!

위와 같은 문제점을 해결하기 위해, 논리 / 가상 주소를 도입하게 되었습니다.

이 가상 주소는 실제로 쓰는 값은 아니기에, 이를 물리 주소로 바꿔서 CPU 가 처리합니다.

Address Binding ( 가상주소 → 물리주소 )

Address Binding 이란, 프로그램이 메모리 어느 물리적 위치에 Load 되어야 할지 결정하는 과정입니다.

  • Compile-Time Binding : 프로세스의 물리적 주소가 컴파일 타임에 정해짐

컴파일 타임에 정해질 경우, 상대 주소의 개념이 쓰이지 않습니다.

같은 주소를 쓰는 프로세스가 있다면 메모리에 적재하지 못하거나, 바꿔치기 될 수 있습니다.

  • Load-Time Binding : Loader 가 프로세스를 Load 하는 시점에 물리적 주소 결정 ( Relocatable )

메모리에 로드되는 순간 상대 주소를 물리 주소로 바꿔주게 됩니다.

하지만 만약 바꿔야 할 주소가 많다면, 로딩에 부담이 되게 됩니다.

  • Run-Time Binding : 프로세스가 수행이 시작된 이후에 프로세스가 실행될 때 메모리 주소를 바꿈

    • Runtime 때 물리적 주소가 결정됨

매번 주소 계산을 다시 해야하니 시간이 오래걸린다는 단점이 있습니다.

이를 보완하기 위해 MMU ( Memory Management Unit ) 를 도입하게 되었습니다.

MMU ( Memory Management Unit )

MMU는 논리 주소를 물리 주소로 바꾸는 하드웨어 장치입니다.

  • CPU 가 발생시킨 논리 주소는 MMU 에 의해 물리 주소로 바뀌어 메모리에 도달

  • 오늘날 MMU 는 CPU 안에 내장

  • MMU 덕분에 여러 프로세스가 하나의 메모리에서 실행됨

상대주소 → 물리주소

메모리 관리자 ( MMU ) 는 사용자 프로세스가 상대 주소를 사용하여 메모리에 접근할 때 마다 상대 주소 값에 Base 레지스터 값을 더하여 절대 주소를 구하는 과정을 진행합니다.

  • Base 레지스터 : 주소 변환의 기본이 되는 주소값을 가진 레지스터

  • 메모리에서 사용자 영역의 시작 주소값이 저장됨

    • 접근할 수 있는 물리적 주소의 최소값
  • Limit 레지스터 : 메모리 관리자는 사용자가 작업을 요청할 때 마다 경계 ( 상한 ) 을 벗어나는 작업을 요청하는 프로세스가 있으면 그 프로세스를 종료

    • 경계 체크

주소 변환

  • CPU 가 읽고 해석하고 발생시키는 주소 → 논리 주소

  • 논리 주소와 물리 주소의 매핑 테이블 존재

  • MMU 를 거쳐 논리 주소가 물리 주소로 바뀌어 출력

  • MMU 는 매핑 테이블을 이용하여 주소 변환

메모리 오버레이

각 프로세스는 자신이 모든 메모리 공간을 점유하고 있는 것 처럼 생각합니다.

하지만 실제 할당된 공간은 프로세스가 실제 필요한 공간보다 작을 수 있습니다.

이 문제를 해결하고자 메모리 오버레이 기법이 도입되었습니다.

  • 프로그램의 크기가 실제 메모리 ( 물리 메모리 ) 보다 클 때 전체 프로그램을 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 기법

  • 프로그램이 실행되면 현재 필요한 부분만 메모리에 가져와 실행 → 바꿔가면서 실행 ( Swap )

    • 한정된 메모리에서 메모리보다 더 큰 프로그램 실행 가능
    • 프로그램 전체가 아니라 일부만 메모리에 올라와도 실행 가능

Swap

  • Swap Area

    • 메모리가 모자라서 쫒겨난 프로세스를 저장장치의 특별한 공간에 모아두는 영역
    • 메모리에서 쫒겨났다가 다시 돌아가는 데이터가 머무는 곳
    • 저장장치는 장소만 빌려주고 메모리 관리자 ( MMU ) 가 관리
    • 사용자는 실제 메모리의 크기와 스왑 영역의 크기를 합쳐서 전체 메모리로 인식하고 사용
  • Swap 하다보니 발생하는 문제점

    • 단편화 문제
    • 성능 문제

메모리 보호 기법

프로세스가 다른 프로세스의 영역을 침범하면 안되니, CPU 는 사용자 모드에서 생성된 모든 메모리 액세스를 확인하여 해당 사용자의 기본값과 제한값 사이에 있는지 확인해야 합니다.

  • MMU 의 지원을 받음

  • Base Register 와 Limit Register 를 사용하여 접근 보호

  • 이 공간을 벗어나는 주소 공간 접근시, 에러 발생

ASLR ( Address Space Layout Randomization )

메모리 주소가 누출되는 일은 보안 상 좋지 않습니다.

이를 막기 위해, 주소 공간은 랜덤하게 배치함으로써 메모리 주소가 누출되더라도 의미 없는 일로 만들어버릴 수 있습니다.

  • 실행할 때마다 논리 주소가 바뀜

  • 실행할 때마다 함수의 지역 변수와 동적 할당 받는 메모리의 논리 주소가 바뀜

2개의 댓글

comment-user-thumbnail
2023년 7월 30일

공감하며 읽었습니다. 좋은 글 감사드립니다.

1개의 답글