2009-03-02 2 views
1

보호 플래그가 프로세스 간 공유에 영향을 줍니까? PROT_READ | PROT_WRITE- 보호 된 mmapped 메모리 영역이있는 경우, 아직 쓰지 않은 한 완전히 공유됩니까?mmap 보호 플래그 프로세스 간 공유에 대한 영향

int prot = PROT_READ|PROT_EXEC; 
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0); 

대 :

int prot = PROT_READ|PROT_WRITE|PROT_EXEC; 
image = mmap(...) 
난 다음, 다시 mprotect가 모두를 매핑 한 후에는 mprotecting보다 간단 때문에 나는, 메모리 영역의 작은 부분에 작은 수정을 할 것

내가 그렇게해야 할 때 작은 부분.

질문은 프로세스 당 복사 된 전체 파일 또는 프로세스마다 수정 한 부분 만 강제로 종료하는지 여부입니다.

답변

1

최근 Linux 시스템의 mmap(2) 매뉴얼 페이지에 따르면 MAP_PRIVATE는 copy-on-write (COW)을 사용하여 메모리를 할당합니다. 즉, 변경하지 않으면 메모리가 복제되지 않습니다. COW가 이것을 구현하는 효율적인 방법이기 때문에 다른 NIX 시스템에서도 이런 방식으로 수행된다고 가정합니다.

mmap의 메모리는 페이지라고하는 동일한 크기의 청크로 구성됩니다. 메모리는 항상 페이지 크기의 배수, 즉 전체 페이지에 매핑됩니다. 각 페이지를 독립적으로 스왑 할 수 있습니다. 따라서이 mmap'ed 메모리 범위에 뭔가를 쓰면 적어도 한 페이지 만 복사해야합니다.

페이지 크기는 시스템에 따라 다르며, x86에서는 대개 4096 바이트입니다. 시스템의 페이지 크기에 관심이 있다면 sysconf(3)을 사용할 수 있습니다.

#include <unistd.h> 
    long pagesize = sysconf(_SC_PAGESIZE); 

당신이 (mmap에에서 얻을 포인터는) 이미 페이지 크기의 배수를 가리 킵니다 당신은 주소가 페이지 경계에 정렬되고() mprotect가를 통과해야한다.