실제 메모리의 일부 영역을 매핑 한 다음 구조체에 넣으려고합니다. 매핑은 정상이며 할당은 OK입니다. (세그멘테이션 오류가 없으므로 그렇게 생각합니다.) 문제는 구조체에서 일부 값을 읽으려고 할 때입니다. 구조체에 대한 포인터입니다. 멤버의 읽기 값에 대한 세그먼트 오류
void *pc = (void *) mmap(0, PageSize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr_start);
이 매개 변수에 너무 가까이 보지 마십시오 :
struct some_struct {
unsigned long a;
unsigned long b;
unsigned long c;
unsigned long d;
unsigned long e;
unsigned long f;
};
가 그럼 난 메모리를 매핑 :
내 구조체는 다음과 같이한다. 나는 이것이 잘 작동하는지 100 % 확신한다.
struct some_struct *ptr = ((struct some_struct *)(pc + some_offset));
은 그 때 나는 시도 :
printf("DDR[%p] -> 0x%x\n", &(ptr->a));
을 그리고 회원의 주소를 얻기 그 후 나는이 작업을 수행. 메모리의 실제 주소를 가리 킵니다. 하지만 다음과 같은 세분화 오류가 발생합니다.
printf("DDR[%p] -> 0x%x\n", &(ptr->a), ptr->a);
구조체를 할당 할 때 실제 주소를 사용해야하는지 잘 모르겠습니다. 또는 나는 아주 명백한 것을 놓치고있다.
Valgrind를 사용해 보셨습니까? – andyn
그건 그렇고, 첫 번째'printf' 호출은 [* 정의되지 않은 행동 *] (http : //en.wikipedia.org/wiki/Undefined_behavior), 당신은 두 가지를 출력하도록'printf'를 지시하지만 인쇄 할 것은 하나만 제공합니다. 또한 포인터를 출력 할 때 실제로 void *로 캐스팅해야한다. –
마지막으로, ['mmap'] (http://man7.org/linux/man-pages/man2/mmap.2.html) 함수는 이미'void *'를 반환하도록 선언되었으므로 반환 값을 캐스팅 할 필요가 없습니다 값. –