2012-10-09 6 views
2

나는 실제 메모리 인 RAM을 의미합니다.C의 메모리 위치 액세스

C에서는 모든 메모리 주소에 액세스 할 수 있으므로 운영 체제가 프로그램의 메모리 공간에없는 메모리 주소를 어떻게 변경하지 못하도록합니까?

특정 메모리 주소를 각 프로그램의 시작과 끝으로 설정합니까? 그렇다면 얼마나 필요한지 어떻게 알 수 있습니까?

+2

"가상 메모리"라는 용어를 찾으십시오. 꽤 광범위한 주제이고 많은 것들 (CPU, OS를 중심으로)에 달려 있습니다. – Mat

+1

ok 나는이 모든 것에 대해 많이 알지 못하므로 downvote하지 마시기 바랍니다. – Apeee

+0

아니요, C에서는 어떤 메모리 주소에도 * 액세스 할 수 없습니다. 포인터는 객체의 주소 인 경우에만 유효합니다. –

답변

1

실제로 프로그램에 가상 메모리이 할당되어 있습니다. OS는 RAM의 일부를 제공하고, 다른 프로세스의 메모리에 액세스 할 수 없습니다 (공유 메모리가 아니라면 찾아보기).

1

아키텍처에 따라 다르지만 일부 프로그램에서는 시스템 충돌을 방지 할 수 없지만 일반적으로 플랫폼은 메모리를 보호하고 다른 프로세스의 주소 공간을 구분하는 수단을 제공합니다.

3

운영 체제 커널은 하드웨어 및 OS가 모두 이것을 지원할 때 메모리 관리 (MMU) 하드웨어와 긴밀하게 작동하여 액세스가 허용되지 않은 메모리에 액세스 할 수 없도록합니다.

일반적으로 액세스하는 주소는 실제 주소가 아니라 가상 주소이며 하드웨어는 액세스를 수행하기 위해 적절한 변환을 수행함을 의미합니다.

+1

downvote에 대한 이유가 있습니까? – mah

+0

아, 너도? :) –

+0

그래 ... 누군가가 경쟁을 조용히하려고하는 것 같아요 :) – mah

0

운영 체제는 TLB (Translation Lookaside Buffers) 및 가상 메모리와 종종 결합되어 운영 체제가 현재 프로세스 컨텍스트에서 읽기 또는 실행 가능으로 태그 지정할 수있는 모든 주소를 페이지으로 변환합니다. 프로세서 MMU 또는 메모리 관리 유닛

최소 요건 (사용자 모드 대조적으로) 만 관리자 모드의 프로세서 레지스터에 설정 될 수있는 범위로 accessable 한 기억을 제한하는 현재의 콘텍스트에있다.

0

이것은 '페이징 (paging)'과 관련이 있으며, 이는 CPU 자체에서 제공합니다. 이전 운영 체제에서는 메모리 주소에 직접 액세스 할 수있는 '리얼 모드'를 사용했습니다. 이와 대조적으로 페이징은 '가상 메모리'를 제공하므로 원시 메모리 자체에 액세스하지 않고 전체 메모리 맵이되도록 프로그램에 표시됩니다.

2

이것은 메모리 보호라고 불리는 것입니다. 그것은 다른 방법을 사용하여 구현 될 수 있습니다. 이 주제에 관한 위키 백과 문서에서 시작하는 것이 좋습니다. http://en.wikipedia.org/wiki/Memory_protection

0

논리 주소는 메모리 매핑 단위로 물리적 주소에 매핑되는 CPU에 의해 생성됩니다. 실제 주소 공간과 달리 논리 주소는 메모리 크기에 의해 제한되지 않으며 논리 주소 공간으로 작업하게됩니다. 주소 바인딩은 MMU에 의해 수행됩니다. 따라서 실제 주소를 직접 처리하지 마십시오.

0

대부분의 컴퓨터 (386 개 이후의 모든 PC)에는 메모리 관리 장치 (MMU)라는 것이 있습니다. 그 일은 입니다. 프로그램에서 사용하는 로컬 주소를 실제 메모리에서 실제 바이트를 가져 오는 데 필요한 실제 주소로 변환합니다. MMU를 프로그래밍하는 것은 운영 체제의 임무입니다.

이 결과 프로그램은 메모리의 모든 영역에로드 할 수 있으며 실행 중에 해당 프로그램의 관점에서 볼 때 다른 주소가 될 수 있습니다.실제로 모든 프로그램의 코드가 동일한 주소에 있고 로컬의 데이터가 물리적으로 다른 위치에 있더라도 같은 주소에있는 것처럼 보입니다 (로컬로 표시됨). 각 메모리 액세스에서 MMU는 로컬 주소 공간에서 물리적 주소로 투명하게 변환됩니다.

프로그램이 로컬 주소 공간에 매핑되지 않은 메모리 주소에 액세스하려고하면 하드웨어가 예외를 생성하고 일반적으로 프로그램의 강제 종료에 이어 "세그먼트 화 위반"으로 플래그가 지정됩니다. 이것은 다른 프로세스의 메모리를 액세스하지 못하게합니다.

하지만 그럴 필요는 없습니다. "가상 메모리"와 실제 메모리 요구량이 RAM에서 실제 메모리 요구량을 초과하는 시스템에서는 일부 페이지 (일반적으로 4-8kB 정도의 보통 크기의 메모리 블럭)를 디스크에 기록 할 수 있습니다 새로운 메모리를 할당하고 사용하려는 프로그램에 RAM으로. 나중에 해당 프로그램이 소유 한 프로그램이 페이지를 필요로 할 때 메모리 액세스가 예외를 일으키고 OS가 다른 메모리 페이지를 스왑 아웃하고 필요한 디스크를 디스크에서 다시로드합니다. 이것이 발생하는 동안 "페이지 오류"가 발생하는 프로그램은 지연되지만 그렇지 않으면 아무것도 알 수 없습니다.

MMU/OS도 프로세스 간 메모리 공유, 디스크 파일을 직접 메모리 액세스 가능, 일부 페이지를 "NX"로 설정하여 다른 사람과 공유 할 수없는 등의 많은 트릭이 있습니다. 물리적 램의 사용량 및 용량에 관계없이 논리적 메모리 공간의 임의 섹션을 사용하여 실행 코드로 처리 할 수 ​​있습니다.