{{위키데이터 속성 추적}}
'''메모리 보호'''는 컴퓨터 메모리의 사용을 제어하는 방법이며 모든 [[운영 체제]]에서 중요한 쟁점사항 중 하나이다. 운영 체제에서 실행하고 있는 [[프로세스]]가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것이 메모리 보호의 주된 목적이다. 이를 통해 프로세스 내의 버그가 다른 프로세스의 동작에 영향을 미치는 것을 예방하며 악성 소프트웨어가 시스템에서 허가되지 않은 접근권한을 갖고 시스템에 영향을 끼치는 것을 막아준다.

== 구동 방식 ==
메모리 보호를 수행하는 데에는 여러 방법이 있다. 이를테면 다음과 같다:
=== 세그먼트 방식 ===
[[메모리 세그먼테이션|세그먼트 방식]]은 컴퓨터 메모리를 여러 개의 크기가 다른 작은 조각(이하 세그먼트)으로 나누어 세그먼트를 프로세스에게 할당하고, 다른 세그먼트에 대한 접근은 제한하는 방식을 말한다. [[x86 아키텍처]]는 몇 가지 세그먼트 기능들을 가지고 있다. 이러한 기능들은 이 아키텍처에서 보호된 메모리를 사용하고자 하는 사람들에게 유용하다.<ref name="autogenerated1">http://www.intel.com/design/processor/manuals/253668.pdf</ref> x86 아키텍처에서 [[전역 서술자 테이블]]과 [[지역 서술자 테이블]]은 컴퓨터 메모리의 세그먼트를 참조하는 데에 사용할 수 있다. 또, x86 프로세서에서 메모리 세그먼트에 대한 포인터는 프로세서의 세그먼트 레지스터에 저장할 수 있다. 초기에 x86 프로세서는 4 개의 세그먼트 레지스터, 곧 CS, SS, DS, ES를 가졌으며 나중에 FS, GS라는 두 개의 세그먼트 레지스터가 추가되었다.<ref name="autogenerated1" />

=== 페이징 ===
{{본문|페이징}}
페이징에서 메모리 주소 공간은 동등한 작은 조각으로 나뉜 [[페이지 (컴퓨팅)|페이지]]들로 이루어진다. [[가상 메모리]] 구조를 사용하여 각 페이지를 물리 메모리의 임의의 위치에 상주하게 만들거나 보호 처리되도록 플래그로 만들 수 있다. 가상 메모리는 선형 [[가상 주소 공간|가상 메모리 주소 공간]]을 가지게 할 수 있고 [[물리 메모리]] 주소 공간 위의 블록에 접근하도록 도와줄 수 있다.

특히 [[x86 아키텍처]]와 같은, 페이지 기반의 수많은 [[컴퓨터 아키텍처]]도 메모리 보호를 위한 페이지를 사용하고 있다.

[[페이지 테이블]]은 가상 메모리를 물리 메모리에 매핑하는 데 사용한다. 일반적으로 프로세스는 이러한 페이지 테이블의 존재 여부를 판단하지 못한다. 페이지 테이블은 새로운 메모리 할당을 쉽게 하고 새로운 각 페이지는 물리 메모리의 어느 곳으로부터라도 할당될 수 있다.

이러한 설계로 응용 프로그램은 할당되지 않은 페이지에는 접근하지 못한다. 그 까닭은 응용 프로그램이 사용하기로 결정한 임의의 메모리 주소가 할당된 페이지를 가리키거나 [[페이지 실패]] (PF) 오류를 만들 수 있기 때문이다.

반면 페이지 실패의 경우 치명적이지 않을 수 있다. 페이지 실패는 메모리 보호에뿐 아니라 다른 흥미로운 방법으로도 쓰인다. 운영 체제는 페이지 실패를 가로챌 수 있고 전에 디스크에 스웨핑해 둔 페이지를 불러올 수 있으며 페이지 실패를 일으킨 응용 프로그램으로 복귀할 수도 있다. 이에 따라 응용 프로그램은 필요하면 메모리 페이지를 수신한다.

스웨핑이라는 구조는 사용하고 있지 않는 메모리 안의 데이터가 디스크 기억 장치로 이동하거나 그 데이터를 디스크 기억장치에서 가져오게 할 수 있다. 이는 응용 프로그램에게는 보이지 않는 방식이며 전반적인 메모리 용량을 늘려 준다.

=== 보호키 ===
보호키(protection key) 구조는 물리 메모리를 특정한 크기 (이를테면 2KB)의 블록으로 나누며 각각 보호키라는 연결된 숫자값을 가지고 있다. 각 프로세스도 이와 연결된 보호키 값을 가지고 있다. 메모리 접근 차원에서 하드웨어는 현재의 프로세스의 보호키가 접근되는 메모리 블록과 연결된 값과 일치하는지를 검사한다. 그렇지 않을 경우 예외 오류가 일어난다. 이러한 구조는 [[IBM 시스템/360|시스템/360]] 아키텍처에 사용되었다.

=== 시뮬레이트되는 세그먼트 방식 ===
[[시뮬레이션]]은 감시 프로그램을 이용하여 일부 컴퓨터의 기계어를 해석하는 것을 말한다. 이러한 시뮬레이터는 세그먼트 방식과 비슷한 구조를 사용하고 실행 전에 실시간으로 각 명령의 길이와 대상 주소의 무결성을 확인함으로써 메모리 보호를 제공할 수 있다. 이러한 시뮬레이터는 대상 주소와 길이를 계산하여 동적 메모리 블록과 같은 [[스레드]] 환경과 관련한 유효한 주소 범위 목록과 비교해야 한다. "유효한"의 뜻은 환경에 따른 스레드의 수명을 통해 바뀔 수 있다. 이는 현재의 실행 모드(storage key냐 supervisor 상태이냐)에 따라 정적 블록의 기억을 바꾸는 것을 허용할 수 있고 허용하지 않을 수도 있다.{{출처|날짜=2008-6-16}}
=== 성능 기반 번지 지정 ===
{{본문|성능 기반 번지 지정}}
성능 기반 번지 지정은 메모리 보호를 위한 흥미로운 구조이지만 현대의 컴퓨터에 쓰이지 않는다. 이 구조에서 포인터는 커널을 통해 실행할 수 있는 권한이 있는 명령어 사용을 통해서만 만들 수 있는 보호된 객체로 치환된다.

== 측정 ==
보호 수준을 알아 보는 유용한 방법은 얼마나 [[최소 권한의 원칙]]을 고수하는지를 측정하는 것이다.<ref>Cook, D.J. [http://portal.acm.org/citation.cfm?id=803220 Measuring memory protection], accepted for 3rd International Conference on Software Engineering, Atlanta, Georgia, May 1978.</ref>

== 다른 운영 체제의 메모리 보호 ==
메모리 보호를 사용하지 않는 운영 체제는 거의 없다. [[CP/M]]과 다양한 종류의 [[MS-DOS]]는 이러한 기능이 부족하다. 그 뒤로 초기 버전의 마이크로소프트 윈도우는 도스 위에 메모리 보호를 추가하였다.

이러한 메모리 보호를 사용하는 운영 체제는 이를테면 다음과 같다:
* [[마이크로소프트 윈도우]] 계열
* 대부분의 [[유닉스 계통]] 운영 체제, 이를테면
** [[솔라리스 (운영 체제)|솔라리스]]
** [[리눅스]]
** [[BSD]]
** [[맥 OS X]] (초기 맥 운영 체제는 제한된 메모리 보호를 사용하였다)

== 같이 보기 ==
* [[보호와 보안의 분할]]

== 각주 ==
<references />

== 외부 링크 ==
* [http://www.intel.com/products/processor/manuals/index.htm 인텔 개발자 매뉴얼] - 여기에는 인텔 기반 아키텍처의 메모리 보호에 대한 깊이 있는 정보가 담겨 있다.
* [http://www.intel.com/design/processor/manuals/253665.pdf]

{{운영 체제}}

[[분류:메모리 관리]]