본문 바로가기
IT

가상 주소 공간 (VAS, Virtual Address Space)

by %? 2020. 6. 8.

1. 가상 메모리 (Virtual Memory)

가상 주소 공간을 알아보려면 그와 관련된 가상 메모리에 대해서 먼저 알아야 한다.

가상 메모리란

- 메모리로써 실제 존재하지는 않지만 사용자에게 있어 메모리로써의 역할을 하는 메모리

- 메인 메모리(RAM)의 저장공간이 부족할 때 하드디스크에 파일 형태로 따로 준비(확장)하는 가상의 메모리 공간으로, 부족한 시스템 메모리를 보조해주는 역할

- 가상 메모리 안에서 프로그램이 실행될 때는 실제 메모리에 머물러 있어야 한다.

- 그러나 프로그램이 실행될 때 반드시 프로그램 전체가 실제 메모리에 있을 필요는 없다.

- 현재 실행되어야 하는 부분만이 실제 메모리에 옮겨져 있으면 되는 것이므로 실제 메모리 용량보다 큰 프로그램이 가상 메모리를 통해 실행 가능하게 된다. → 맵핑을 통해 필요한 부분을 빠르고 정확하게 가져와 준다.(대표적으로 Paging 기법)

 

운영 방식

- 필요한 것만 RAM으로 가져오고, 가장 오랫동안 안 쓰인 것은 하드디스크에 내려놓는다.

 

프로그램 실행 순서(Paging)

- 가상 메모리 상의 주소공간을 일정한 크기 (대부분 4Byte)로 분할하고 실제 메모리 또한 가상메모리와 같은 크기로 분할한다.

 

1. 프로그램 실행 시 OS는 RAM 가상 메모리의 페이지와 실제 메모리의 페이지를 연결시켜주기 위한 맵핑 테이블인 Page Table을 생성하고, 실행에 필요할 것 같은 페이지만 우선 프레임에 맵핑한다.

2. RAM에서의 주소값(물리 주소)과 일치하는 VAS(가상 주소 공간)에서의 주소값(논리 주소)을 Page Table에 저장한다.

3. MMU(Memory Management Unit)가 VAS 주소값을 RAM 주소값으로 변환하여 MAR(Memory Address Register)로 전달한다.

 

2. 가상 주소 공간 (VAS, Virtual Address Space)

- OS가 프로세스를 시작할 때 할당해주는 가상 메모리 공간. 프로세스에서 사용 가능한 주소의 범위

- OS가 제공하는 가짜 메모리(프로그래머는 실제 메모리라 간주하고 사용하면 된다.)

 

32bit 시스템

- 보통 4GB 크기의 가상 메모리 영역을 할당 받는다.

- 보통 하위 2GB를 유저 공간에, 상위 2GB는 시스템 공간에 사용된다.

- 하지만 사용자에 의해 유저 공간을 3GB로 늘릴 수 있다. (/set increaseuserva)

 

64bit 시스템

- 이론적으로는 16EB의 가상 메모리 영역을 할당 받을 수 있지만 너무 크고 비효율적이여서 128TB 정도로 제한하고 있다.

 

32bit VAS 범위 : 0x00000000 ~ 0x7FFFFFFF

64bit VAS 범위 : 0x000’00000000 ~ 0x7FFF’FFFFFFF

 

3. 가상 주소 공간 구조

4GB로 가정한다.

- 가상 메모리의 구조는 크게 나누어 사용자 영역과 커널 영역으로 나눌 수 있다.

- 가상 메모리가 할당되면 2GB의 사용자 영역과 2GB의 커널 영역으로 나누어 진다.

 

사용자 영역

- 우리가 보통 사용하는 일반 응용 프로그램들이 사용하는 공간

- 0x00000000 ~ 0x7FFFFFFF

커널 영역

- 단일 공간으로, kernel-mode를 사용하는 모든 프로세스에서 공유되며, 커널 영역은 공유되면서 시스템 운영에 필수적이기 때문에 주로 페이지 파일보다는 RAM에 존재하고 있다.

- 0x80000000 ~ 0xFFFFFFFF

 

※지금부터 나오는 영역들은 가변적인 영역들로 설명을 위해 임시로 만든 구조입니다.※

 

Code : 코드를 저장할 공간. 사용자가 만든 함수는 모두 Code 영역에 저장된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Data : 초기화된 전역 변수, Static 변수의 할당을 위해 존재하는 공간

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bss : 초기화 되지 않은 변수의 할당을 위해 존재하는 공간

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Heap : 동적 할당되는 변수의 데이터가 위치하는 영역. 사용자의 의사에 의해 원하는 데이터를 사용자 정의에 의해 할당된 메모리에 저장하거나 해제한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Stack : 잠시동안 사용하고 삭제할 데이터를 저장하는 공간. 프로그램에서 사용되는 각종 환경 변수, 매개변수, 리턴 값, 지역 변수 등의 정보를 담고 있는 영역

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고한 사이트들

https://wayhome25.github.io/cs/2017/04/13/cs-15-1/

http://anster.egloos.com/v/2134653

https://cooablue.tistory.com/entry/%EA%B0%80%EC%83%81%EC%A3%BC%EC%86%8C

https://velog.io/@pa324/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B0%9C%EB%85%90-4dk2q3ivff

https://brownbears.tistory.com/47

https://mooneegee.blogspot.com/2015/01/osvirtual-memory-2-virtual-address.html

https://l2men.tistory.com/21

docs.microsoft.com/en-us/windows/win32/memory/virtual-address-space

docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/virtual-address-spaces

https://whereisusb.tistory.com/10

en.wikipedia.org/wiki/Virtual_address_space

ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EC%A3%BC%EC%86%8C_%EA%B3%B5%EA%B0%84