2009-11-06 3 views
3

mprotect()로 메모리 영역을 보호 한 후 처음으로 malloc()을 호출 할 때 세그먼트 화 오류가 발생합니다. 이 메모리 할당에게 보호를 수행하는 코드 스니 플릿입니다 :mproct 후 malloc 세그먼트 화 오류 발생

#define PAGESIZE 4096 
void* paalloc(int size){ // Allocates and aligns memory 
     int type_size = sizeof(double); 
     void* p; 
     p = malloc(type_size*size+PAGESIZE-1); 
     p = (void*)(((long) p + PAGESIZE-1) & ~(PAGESIZE-1)); 
     return p; 
} 
void aprotect(int size, void* array){ // Protects memory after values are set 
     int type_size = sizeof(double); 
     if (mprotect(array, type_size*size, PROT_READ)) { 
       perror("Couldn't mprotect"); 
     } 
} 

내 배열로 쓰는 것을 방지하기 위해 mprotect가를 사용하려면 (있는 사인/코사인 값을 미리 계산). 이것은 어리석은 생각입니까?

+0

cast (void *) mallac ....도 입력하십시오. – Vijay

+0

@john : 캐스트가 필요하지 않습니다. – Wernsey

+0

이 게시물을 편집하기에 충분하지 않지만이 질문을 찾는 사람은 이 : http://stackoverflow.com/questions/1686464/alternatives-to-mprotect 페이지 정렬에 관한 Caf의 대답은 죽었습니다. 오늘 뜨거운 주제 인 것 같습니다 :) –

답변

7

mprotect은 이미 알고있는 것처럼 페이지 단위로만 작동 할 수 있습니다. 이 경우 정확하게 블록 시작을 페이지 경계에 맞춰야하지만, 이 아닌 것은이 아니라면 사용하려는 마지막 페이지의 끝까지 할당을 확장 할 수 있습니다.

즉, mprotect은 할당 끝 (페이지 끝까지) 인 데이터를 보호합니다. 즉, 다음 malloc 호출에서 쓸 수 있다고 가정하는 공간입니다.

malloc 전화 번호의 PAGE_SIZE - 1PAGE_SIZE * 2으로 변경하는 것이 가장 쉬운 방법입니다.

+0

고마워요! mprotect의 맨 페이지에 뭔가 빠졌거나 오류가 있습니까? 예제는 똑같은 문제가 있습니다 ... – hanno

+0

'mprotect' 매뉴얼 페이지가 mine과 다른 것으로 의심됩니다. malloc' 대신에 페이지 정렬, 페이지 다중 크기 블록을 할당하기 위해'memalign'을 사용합니다. (실제로'memalign '도 사용하는 것을 고려해야한다.) – caf

0

caf에는 문제의 원인이 있습니다.

나는 당신이 mprotect()없이 할 수 있다고 생각 : 당신이 정적으로 포인터를 선언하는 것이 중요하다 경우 lookup.c (또는라고 무엇이든) 다음 비 정적 double get_sine(int index); 기능을 가지고있다. 이렇게하면 lookup.c 외부의 코드는 get_sine()에만 전화를 걸 수 있으며 테이블에 직접 액세스 할 수 없습니다. 내 mprotect() 사람 페이지에서 또한

는 :

POSIX는 분명히이 수행 mprotect는()가 (만의 mmap에서 (2)

을 얻은 메모리의 영역에 을 사용할 수 있다고 Linux 운영체제는 아닙니다. 어떤 운영 체제를 사용하고 있습니까?)

1

mmap을 사용하여 직접 익명 매핑을 만든 다음 배열에 쓰기를 마친 후 mprotect를 호출하는 것이 좋습니다. 항상 전체 페이지를 할당하기 때문에 힙을 전혀 사용하지 않는 것이 좋습니다. 작은 목적 (ish) 객체의 할당 및 할당 해제를 처리하는 것이 주 목적입니다. 페이지 블록을 처리 할 때 불필요한 오버 헤드가 추가됩니다.