Search
Duplicate
🍎

[운영체제] 메모리 가상화 - 주소변환의 원리

간단소개
메모리 가상화 구현을 위한 주소변환의 원리에 대해 알아보자!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
운영체제
Scrap
태그
메모리
9 more properties
“운영체제 : 아주 쉬운 세가지 이야기”를 읽으면서 핵심 내용을 정리하였습니다. 이화여대 반효경 교수님의 운영체제 강의를 듣고 복습 차원에서 책 한권을 완독해보고자 합니다. 잘못된 정보가 있다면 댓글 남겨주시면 감사하겠습니다!

주소 변환의 원리

운영체제는 효율성, 제어, 유연성을 추구하면서 주소변환을 하려고 한다.
효율성 : 레지스터, TLB 등의 하드웨어의 도움을 받는다
제어 : 하드웨어의 도움을 받아 응용프로그램이 자기 자신의 메모리 이외의 공간에 접근하지 못하도록 막는다.
유연성 : 프로그래머가 원하는 대로 주소공간을 사용할 수 있어야 한다
주소 변환의 핵심 기법은 하드웨어 기반 주소 변환이다. 이러한 주소 변환을 통해 가상 주소를 정보가 실제 존재하는 물리 주소로 변환한다.
즉, 프로그램의 모든 메모리 참조를 실제 메모리 위치로 재지정한다. 운영체제는 메모리의 빈공간과 사용중인 공간을 항상 파악하므로서 메모리를 제어 할 수 있다.

가정

아래의 비현실적인 가정들을 완화하면서 실제적인 메모리 가상화를 알아볼 것이다.
1.
사용자의 주소공간은 물리 메모리에 연속적으로 배치된다.
2.
주소공간의 크기는 물리 메모리 크기보다 작다
3.
각 주소공간의 크기는 같다

사례

void func() int x = 3000; x = x + 3; // 어셈블리어로 변환하면 128 : movl 0x0 (\%ebx), \%eax; 132 : addl \$0x03, \%eax; 136 : movl \%eax, 0x0(\%ebx);
Assembly
복사
ebx에 x의 주소가 저장되어 있다고 가정하면
주소 128의 명령어를 반입
명령어를 실행 : 주소 15kb에서 범용레지스터 eax로 탑재
주소 132의 명령어를 반입
명령어를 실행 : 레지스터 eax값에 3을 더함
주소 136의 명령어를 반입
명령어를 실행 : 주소 15kb에 eax 레지스터 값을 저장
프로세스는 상기 코드를 실행하기 위해 위와 같은 과정을 거치게 된다. 운영체제는 아래와 같이 메모리 가상화를 위해 상기 주소공간을 물리메모리의 0번지가 아닌 다른 공간에 위치 시키려고 한다.

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

각 CPU마다 2개의 하드웨어 레지스터인 베이스(base) 레지스터와 바운드(bound) 레지스터를 가지고 있다.
베이스 레지스터
프로그램이 물리 메모리에 탑재 될때, 운영체제는 어느 위치에 프로그램이 탑재 될지 결정하고 해당 위치를 베이스 레지스터 값으로 지정
pysical address = virtual address + base
하드웨어는 가상주소에 베이스값을 더하여 실제 물리 주소로 변환을 한다.
바운드 레지스터
메모리 보호를 위해 존재하는 레지스터
가상 주소가 바운드 안에 존재 하는지 확인할 때 필요한 값. 가상주소의 최대 크기 저장되어 있음
프로세스가 바운드 보다 큰 가상주소나 음수인 가상 주소를 참조하려고 하면 CPU는 예외를 발생 시킨다.
한 쌍의 레지스터를 가지고 주소변환에 도움을 주는 프로세서의 일부를 메모리 관리 장치(memory management unit, MMU)라고 한다.
다른 프로그램으로 전환할 때는 운영체제가 커널 모드에서 베이스와 바운드 레지스터의 값을 변경한다.

하드웨어 지원 요약

운영체제 개입 시점

1.
프로세스가 생성될 때, 운영체제는 주소공간이 저장될 메모리 공간을 찾아야 한다.
빈공간 리스트라고 불리는 자료구조를 검색
2.
프로세스가 종료될 때, 프로세스가 사용하던 메모리를 회수하여 다른 프로세스나 운영체제가 사용 할 수 있도록 해야한다.
종료된 프로세스의 메모리를 빈공간 리스트에 넣고 연관 자료구조를 정리
3.
프로세스 전환시, 베이스와 바운드 쌍을 저장하고 복원해야 한다.
프로세스를 중단 시킬 때, 프로세스 제어블럭(process control block, PCB)라고 불리는 프로세스별 자료구조에 베이스와 바운드 레지스터 값을 저장
프로세스를 처음 시작 혹은 재개 실킬 때, CPU의 베이스 바운드 값을 설정
4.
예외 핸들러 또는 호출될 함수를 제공해야한다.
부팅시, 특권 명령어를 사용하여 예외 핸들러를 설치함
CPU가 예외를 발생시킬 때(바운드 밖의 메모리를 접근하려는 경우), 예외에 따른 핸들러가 작동. 보통은 프로세스 종료

동적 재배치의 단점

프로세스 가상메모리공간 전체를 연속적으로 물리 메모리에 탑재 하게 됨으로서 프로세스의 힙과 스택 사이의 공간이 낭비되는 현상이 발생한다. 이를 내부 단편화 (internal fragmentation)이라고 한다. 이를 해결하기 위해 세그멘테이션(segmentation)이라는 일반화된 base-bound 기법이 등장하게 된다.