다음을 통해 공유


메모리 섹션 관리

드라이버는 섹션 개체에 대한 핸들을 반환하는 ZwCreateSection을 호출하여 섹션 개체를 만들 수 있습니다. FileHandle 매개 변수를 사용하여 지원 파일을 지정하거나 섹션이 파일 지원되지 않는 경우 NULL을 사용합니다. ZwOpenSection을 사용하여 섹션 개체에 대한 추가 핸들을 열 수 있습니다.

섹션 개체에 속한 데이터를 현재 프로세스의 주소 공간 내에서 액세스할 수 있도록 하려면 섹션 보기를 매핑해야 합니다. 드라이버는 ZwMapViewOfSection 루틴을 사용하여 섹션 보기를 현재 프로세스의 주소 공간에 매핑할 수 있습니다. SectionOffset 매개 변수는 뷰가 섹션 내에서 시작되는 바이트 오프셋을 지정하고 ViewSize는 매핑할 바이트 수를 지정합니다.

Protect 매개 변수는 보기에서 허용되는 작업을 지정합니다. 읽기 전용 보기에 PAGE_READONLY 지정하고, 읽기/쓰기 보기에 PAGE_READWRITE, 쓰기용 복사 보기에 PAGE_WRITECOPY 지정합니다.

가상 메모리 범위에 액세스할 때까지 보기에 실제 메모리가 할당되지 않습니다. 메모리 범위의 첫 번째 액세스로 인해 페이지 오류가 발생합니다. 그러면 시스템에서 해당 메모리 위치를 저장할 페이지를 할당합니다. 섹션이 파일 백업인 경우 시스템은 해당 페이지에 해당하는 파일의 내용을 읽고 메모리에 복사합니다. (사용되지 않는 섹션 개체 및 뷰는 부기 용도로 페이지가 지정된 풀과 페이지가 없는 풀을 사용합니다.)

드라이버가 더 이상 보기를 사용하지 않으면 ZwUnmapViewOfSection을 호출하여 매핑을 해제합니다. 드라이버가 더 이상 섹션 개체를 사용하지 않으면 ZwClose를 사용하여 섹션 핸들을 닫습니다. 뷰가 매핑되고 다른 뷰가 매핑되지 않으면 섹션 핸들에서 ZwClose 를 즉시 호출하는 것이 안전합니다. 뷰(및 섹션 개체)는 뷰의 매핑을 해제할 때까지 계속 존재합니다. 이는 드라이버가 핸들을 닫지 못하는 위험을 줄이기 때문에 권장되는 방법입니다.