이 코드 세그먼트가 세그먼트 오류를 일으키는 이유는 무엇입니까?mmap : map_anonymous 왜 SIGSEGV를 제공합니까?
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
int main()
{
void *ptr;
ptr=mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0);
strcpy(ptr, "Hello");
}
또는 더 나은, 내가하고 싶은 : char *ptr=malloc(10);
다음 메모리 매핑이 인수를 전달합니다. 둘 다 SIGSEGV를 제공합니다.
+1, 세분화 오류를 진단 수단으로 사용하는 것이 항상 바람직한 결과를 얻을 수있는 것은 아닙니다. –
고마워, 해결 됐어. 이제 malloc의 반환 값을 mmap의 첫 번째 인수로 사용하고 있습니다. malloc 대신 메모리 맵핑이 오버 헤드가 될 수 있다고 생각하십니까? – kingsmasher1
@ kingsmasher1 : 가능합니다. 'mmap'의 최소 매핑은 1 페이지 (많은 시스템에서는 4k이지만 훨씬 더 클 수 있습니다.)이므로 작은 할당에 적합하지 않습니다. (매핑 테이블 내부에서 작은 덩어리를 관리하지 않는 한. (OS 및 CPU의 경우) 오버 헤드가 발생합니다. 자신이 수행 한 작업을 빠르고 저렴하게 구현할 수 있다고 생각하지 마십시오. 수행하기 어렵고 "완벽하게"수행하기가 거의 불가능합니다. 심지어 밸 글 린드도 모든 잘못된 메모리 참조를 캐치하고 실제로는 전체 CPU_와 _emulates – Mat