글쎄, 이것은 일반적이거나 이미 질문 된 것처럼 보일 수 있지만 다양한 서적, 온라인 자습서 및 심지어 SU에 대한 검색 후에도이 네 짐승이 x86 보호 모드 시스템에서 어떻게 작동하는지 여전히 의아해합니다.
이러한 것들에 대해 논의 할 때 사용할 수있는 올바른 용어는 무엇입니까?
내가 이해하는 한이 4 가지 개념은 완전히 다르지만 메모리 보호에 대해 이야기 할 때 관련이 있습니다. 이것은 나를 위해 엉망이 된 곳입니다!
먼저 스와핑부터 시작하겠습니다.
스와핑 :
프로세스는 실행을 위해 실제 메모리에 있어야합니다. 프로세스는 물리적 메모리에서 일시적으로 백업 저장소로 스왑 한 다음 계속 실행되도록 메모리로 다시 가져올 수 있습니다.
이는 특히 여러 프로세스를 동시에 실행해야하는 멀티 태스킹 환경에 적용되므로 CPU 스케줄러가 구현되어 백업 저장소로 교체 할 프로세스를 결정합니다.
페이징 : 일명 간단한 페이징 :
예를 들어, 프로세스가 0-16MB 범위의 모든 주소를 사용한다고 가정 해 봅시다. 주소가 프로세스에 의해 생성 되므로 프로세스 의 논리 주소 공간 이라고 할 수 있습니다 .
이 정의에 따르면 프로세스의 논리 주소 공간은 프로세스가 크거나 작을 수 있으므로 다른 프로세스의 논리 주소 공간과 다를 수 있습니다.
이제 프로세스의이 논리 주소 공간을 페이지 라고하는 동일한 크기의 블록으로 나눕니다 . 또한 물리적 메모리를 프레임 이라는 고정 크기 블록으로 나눕니다 .
데프. 논리 주소 = page # : 해당 페이지의 오프셋
프로세스가 CPU 스케줄러에 의해 실행되도록 선택되면 해당 페이지는 백업 저장소에서 사용 가능한 메모리 프레임 으로로드됩니다 .
참고 모든 컨트롤이 스케줄러에서이 프로세스에 옮겨진 전에이 과정에 속하는 페이지가 메모리에로드됩니다. 이 프로세스를 백업 저장소로 바꾸려면 모든 페이지가 백업 저장소에 저장됩니다.
백업 저장소는 실제 메모리 프레임과 동일한 크기의 고정 크기 블록으로 나뉩니다.
바이트가 아닌 페이지를 스왑 할 때 스왑 프로세스가 쉬워집니다. 일부 바이트에 대한 공간을 찾을 필요가 없기 때문에 백업 저장소에서 조각화가 줄어드는 대신 페이지에 사용 가능한 공간이 있는지 확인합니다.
페이징 기술은 또한 페이지를 메모리에 유지함에 따라 물리적 메모리의 조각화를 줄입니다.
실행을 위해 메모리에 해당 프로세스를로드 하려면 기본 메모리 에는 프로세스에 속하는 모든 페이지를 위한 공간이 있어야합니다 . 이 프로세스의 몇 페이지에 대해서만 공간이있는 경우 다른 프로세스 (예 : 프로세스에 속하는 모든 페이지)를 백업 저장소로 교체 한 다음 실행할 프로세스의 모든 페이지 만 메모리에로드해야합니다.
따라서 페이징 기술은 단순한 스와핑보다 더 나은 성능을 제공합니다.
따라서 스와핑을 통해 너무 많은 메모리를 구매하지 않고도 여러 프로세스를 실행할 수 있습니다. 대신 적은 양의 메모리로 작업 할 수 있습니다 (이 크기는 가장 큰 프로그램 / 프로세스의 모든 페이지가 PC에서 실행되도록해야합니다) 메모리에로드 할 수 있습니다. 즉, 프로그램을 실행하기 전에 프로그램에 필요한 메모리 양을 알아야합니다.) 추가 백업 저장소 (일반적으로 디스크)는 주 메모리보다 훨씬 큰 용량에 비해 비용이 훨씬 적게 듭니다.
따라서 스와핑 + 페이징을 통해 메모리를 효율적으로 관리 할 수 있으므로 시스템에서 여러 프로세스를 실행할 수 있습니다.
수요 페이징 :
그러나 시스템에 설치된 실제 메모리는 프로세스 요구 사항과 같을 필요는 없습니다. 또한 여러 프로세스를 실행해야합니다.
해결책은 프로세스의 일부 페이지 만 메모리 에로드 하는 것입니다. 프로세스 가 메모리에없는 페이지의 주소에 액세스하면 페이지 오류가 발생하고 요청시 OS가 해당 페이지 를 로드 하여 프로세스를 계속 실행할 수 있습니다. . 따라서 페이징 + 스와핑과 마찬가지로 제어를 전송하기 전에 해당 프로세스의 모든 페이지를로드하는 시간이 절약됩니다.
프로세스의 일부만 메모리에 유지하고 디스크와 같은 백업 저장소에있는이 기술을 요구 페이징 이라고 합니다.
따라서 수요 페이징 = 페이징 + 스와핑 + 프로세스의 일부 페이지 만 메모리에 유지합니다.
이것은 내가 아는 페이징 및 스왑에 관한 것입니다. 위의 어딘가에 내가 틀렸다는 것을 수정하십시오.
이제 내 질문은 :
x86 보호 모드와 관련하여 가상 메모리 및 가상 주소 공간 (일명 선형 주소 공간) 용어가 수요 페이징과 정확히 관련되는 방법
"프로세스의 가상 메모리"가 올바른 용어 입니까, 아니면 멀티 태스킹 시스템에서 현재 실행중인 모든 프로세스에 대해 가상 메모리가 정의되어 있습니까?
프로세스에 사용할 수있는 가상 메모리 == 프로세스의 가상 주소 공간 (일명 선형 주소 공간)에서 가장 높은 주소 + 1?
x86 보호 모드에서는 각 프로세스에 4GB VAS (가상 주소 공간)가있을 수 있다는 메시지가 나타납니다. 즉, x86 아키텍처에 세그먼테이션 이 있으므로이 VAS 를 둘 이상의 세그먼트로 나눌 수 있습니다. . x86 Flat 모델에서, 프로세스의 VAS에 세그먼트가 모두 정확하게 겹치므로 세그먼트가 효과적으로 비활성화되므로 세그먼트가 없습니다. 그러나 일부 프로세스의 VAS의 가상 주소에서 일부 CPU 명령어가 존재하면 메모리를 할당하거나 (이 VAS에서) 변수 또는 배열을 만들 때 이러한 명령어를 덮어 쓸 수 있습니다. 이런 일이 발생하지 않도록 어떻게해야합니까? 디스크립터의 보호 비트는 플랫 모드에서 모든 세그먼트가 겹치는 영역을 흑백으로 구분하지 않습니다. 이 비트는 코드를 읽거나 데이터를 실행하는 것을 막을뿐 아니라 세그먼트를 통해 셀렉터를 통해 액세스 할 수 있습니다.
또는 각 세그먼트가 자체 VAS로 취급되는 것과 같은 것입니까? 그러나이 경우 플랫 모드에서 프로세스 에 사용 가능한 총 가상 메모리 (또는 총 VAS) 는 "단일 세그먼트의 프로세스 x 가상 메모리에 속하는 세그먼트 수"입니다. x86 보호 모드의 경우 이는 6 x 4GB = 24GB의 VAS로 변환됩니다! CS, DS, ES, GS, FS, SS 레지스터가 가리키는 6 개의 세그먼트를 가정합니다. 이 올바른지 ?
가상 메모리가 아닌 단순 페이징 (요청 페이징은 아님)을 지원하는 환경은 플랫 메모리 모델에서 다양한 세그먼트의 보호를 어떻게 보장합니까? 여기에는 단일 작업 시스템과 다중 작업 시스템이라는 두 가지 경우가 있습니다.
업데이트 : 2012-07-29
그래서 내가 올바르게 이해하면 :
가상 메모리는 개념 이며 수요 페이징 기술과 일부 보호 비트 (특히 U 비트 및 W 비트) 를 사용하여 x86 아키텍처에서 구현 됩니다 .
프로세스의 VAS 인 IOW는 페이지 로 나뉘어 수요 페이징에 사용됩니다.
가상 메모리 메커니즘은 기본적으로 멀티 태스킹 환경에서 두 가지 용도로 사용 됩니다.
프로그램 크기가 사용 가능한 실제 메모리 양을 초과 할 수 있습니다. 운영 체제는 현재 사용중인 프로그램 부분을 주 메모리에, 나머지 부분은 디스크에 보관합니다. 이는 페이지 테이블 항목에 '현재 비트'및 '액세스 된 비트'와 연관된 각 페이지가있는 요청 페이징에 의해 구현됩니다.
각 프로세스에 고유 한 가상 주소 공간을 제공하여 한 프로세스가 다른 프로세스의 VAS에 액세스 할 수 없도록 하여 메모리를 보호합니다 . 이것은 각 페이지와 관련된 보호 비트를 가짐으로써 구현됩니다 . 특히 페이지 테이블 항목의 '사용자 / 감독자 비트-U 비트', 읽기 / 쓰기 비트 W 비트 '는 페이지 액세스 보호에 사용 됩니다.
가상 메모리는 단일 태스킹 시스템과 다중 태스킹 시스템 모두에 유용 합니다. 단일 작업 시스템의 경우 Use # 1 만 관련됩니다.
페이지 액세스 보호는 두 측면이있다 : privledge 수준의 보호 및 보호를 쓰기 . 이들은 각각 U 비트 (사전) 및 W 비트 (쓰기)로 구현됩니다. 이 비트는 해당 페이지의 페이지 테이블 항목에 있습니다.
메모리 보호에는 두 가지 측면이 있습니다 . 프로그램이 서로 액세스하지 못하도록 보호하고 세그먼트가 해당 프로세스 / 프로그램의 VAS에서 겹치는 경우 프로그램이 자신 을 덮어 쓰지 않도록 보호합니다 .
이제 이전 문제는 VAS 또는 가상 메모리 개념으로 해결되었지만 후자의 경우는 어떻습니까?
페이지 액세스 보호 체계 는 내가 아는 한 후자를 보호 하지 않습니다 . IOW (가상 메모리 기술)는 세그먼트가 프로세스의 VAS에서 겹치는 경우에 프로그램이 자체를 덮어 쓰는 것을 막지 않습니다.
그러나 세그먼트 레벨 보호조차도 메모리 보호의 후자 (덮어 쓰기 자체) 문제를 막을 수는없는 것 같습니다 .
x86 CPU 는 x86 CPU에서 분할을 비활성화 할 수있는 방법이 없으므로 플랫 또는 다중 세그먼트 모델인지 여부에 관계없이 페이지 수준 보호 검사 를 수행 하기 전에 항상 세그먼트 수준 보호 를 평가합니다 .
플랫 모델 시나리오를 고려하십시오.
CS : off가 참조하는 가상 주소를 고려하십시오. 이제 두 경우 모두 'off'값이 정확히 동일한 경우 DS : off는 CS : off에서 참조한 것과 동일한 가상 주소 를 참조합니다. SS : off도 마찬가지입니다.
또한 이 가상 / 선형 주소가있는 페이지는 페이징 단위에서 세그먼트 화에 대해 알지 못하는 단순한 페이지로 간주됩니다.
플랫 모드에서 프로그램의 모든 세그먼트가 ring0과 같은 동일한 권한 레벨에 속한다고 가정하십시오.
이제 CS : off = DS : off = SS : off에서 데이터를 쓰거나 실행하려고하면 어떻게됩니까?
이 주소가 프로세스의 VAS에 매핑 된 OS 코드에 속하지 않는다고 가정합니다. 간단히하기 위해 OS를 따로 보관 해 두십시오. 하드웨어 수준의 보호에 대해 이야기하고 있습니다!
모든 세그먼트로에 속하는 첫째, 세그먼트 수준의 보호가 전달됩니다 다음, 권한 수준 점검이 페이지에 액세스 (: 끄거나 DS : 꺼져 있거나 SS 오프 CS가 포함 된 페이지) 동안 전달됩니다 같은 특권 여기에,하지만에 대한 이 페이지의 W 비트. 쓰기를 허용하려면 1로 설정해야합니다. 그렇지 않으면 데이터 세그먼트가 자신의 페이지에서 쓰기를 수행 할 수 없습니다. 따라서 이것은이 페이지도 쓸 수 있음을 의미합니다.
즉,이 가상 (선형) 주소에서 데이터를 읽거나 쓰거나 실행할 수 있습니다. CS : off = DS : off = SS : off.?
세그먼트가 겹치는 경우 x86 하드웨어가이 문제를 어떻게 보호 할 수 있는지 이해하지 못합니다 .