가능한 모든 주소에서 메모리를 읽으려고하는 프로그램을 작성하고 "전체"Unix에서 실행하면 모든 실제 RAM에 액세스 할 수 없습니다. 그러나 운영 체제는 어떻게 그렇게하지 못하게합니까?
모든 어셈블리 코드가 모든 것에 액세스 할 수있는 작은 CPU 아키텍처에 더 익숙합니다. 프로그램 (커널)이 어떻게 이러한 악의적 인 작업을 탐지 할 수 있는지 이해하지 못합니다.
가능한 모든 주소에서 메모리를 읽으려고하는 프로그램을 작성하고 "전체"Unix에서 실행하면 모든 실제 RAM에 액세스 할 수 없습니다. 그러나 운영 체제는 어떻게 그렇게하지 못하게합니까?
모든 어셈블리 코드가 모든 것에 액세스 할 수있는 작은 CPU 아키텍처에 더 익숙합니다. 프로그램 (커널)이 어떻게 이러한 악의적 인 작업을 탐지 할 수 있는지 이해하지 못합니다.
답변:
나쁜 메모리 액세스를 막는 것은 커널이 아니며 CPU입니다. 커널의 역할은 CPU를 올바르게 구성하는 것입니다.
보다 정확하게는, 나쁜 메모리 액세스를 방지하는 하드웨어 구성 요소가 MMU 입니다. 프로그램이 메모리 어드레스에 액세스 할 때, 어드레스는 MMU의 내용에 기초하여 CPU에 의해 디코딩된다. MMU는 가상 주소에서 물리적 주소로의 변환을 설정합니다. CPU가 특정 가상 주소에서로드 또는 저장을 수행하면 MMU 내용을 기반으로 해당 물리적 주소를 계산합니다. 커널은 각 프로그램이 권한이있는 메모리에만 액세스 할 수 있도록 MMU 구성을 설정합니다. 다른 프로그램의 메모리 및 하드웨어 레지스터는 프로그램의 메모리에 전혀 매핑되지 않습니다. 이러한 물리적 주소에는 해당 프로그램의 MMU 구성에 해당하는 가상 주소가 없습니다.
서로 다른 프로세스 간의 컨텍스트 전환에서 커널은 MMU 구성을 수정하여 새 프로세스에 대한 원하는 변환을 포함합니다.
일부 가상 주소는 전혀 매핑되지 않습니다. 즉, MMU는이 주소를 특수한 "주소 없음"값으로 변환합니다. 프로세서가 매핑되지 않은 주소를 역 참조하면 트랩이 발생합니다. 프로세서는 커널 코드에서 미리 정의 된 위치로 분기합니다. 어떤 함정은 합법적입니다. 예를 들어 가상 주소는 스왑 공간 에있는 페이지에 해당 할 수 있으며 ,이 경우 커널 코드는 스왑에서 페이지 내용을로드 한 다음 메모리 액세스 명령이 다시 실행되는 방식으로 원래 프로그램으로 다시 전환합니다. 다른 트랩은 합법적이지 않습니다.이 경우 프로세스는 기본적으로 프로그램을 즉시 종료 시키는 신호 를 수신 합니다 (프로그램의 신호 처리기로 분기되지 않는 경우 : 메모리 액세스 명령이 완료되지 않은 경우).