2014-10-20 3 views
0

실제 메모리의 일부 영역을 매핑 한 다음 구조체에 넣으려고합니다. 매핑은 정상이며 할당은 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); 

구조체를 할당 할 때 실제 주소를 사용해야하는지 잘 모르겠습니다. 또는 나는 아주 명백한 것을 놓치고있다.

+1

Valgrind를 사용해 보셨습니까? – andyn

+2

그건 그렇고, 첫 번째'printf' 호출은 [* 정의되지 않은 행동 *] (http : //en.wikipedia.org/wiki/Undefined_behavior), 당신은 두 가지를 출력하도록'printf'를 지시하지만 인쇄 할 것은 하나만 제공합니다. 또한 포인터를 출력 할 때 실제로 void *로 캐스팅해야한다. –

+1

마지막으로, ['mmap'] (http://man7.org/linux/man-pages/man2/mmap.2.html) 함수는 이미'void *'를 반환하도록 선언되었으므로 반환 값을 캐스팅 할 필요가 없습니다 값. –

답변

1

전체 도움말을 제공하는 데 코드가 충분하지 않습니다.

나는 당신이 코드에서 가질 수있는, 유일하게 가능한 문제를 제공 할 수

man mmap에서 :

1)를 읽고 작성하려는 경우, 당신은 당신의 코드에서 open("./file.txt", O_RDWR);이 있어야합니다.

The prot argument describes the desired memory protection of the mapping 
(and must not conflict with the open mode of the file). 

2)는 mustk*sysconf(_SC_PAGE_SIZE) 수 오프셋.
예를 들어, 내 시스템에서 페이지 크기는 4096입니다. 따라서 addr_start4*4096과 같아야하며 12 또는 임의의 숫자가 아니어야합니다.

offset must be a multiple of the page size as returned by sysconf(_SC_PAGE_SIZE) 

3) 모든 경고가 활성화 된 상태에서 코드를 컴파일하고 컴파일러에서 작성할 내용을 확인하십시오. gcc을 사용하는 경우 -Wall 플래그를 추가하십시오. 이미 printf 문에 정의되지 않은 동작이 있습니다 (주석에 이미 언급되어 있습니다). -Wall 컴파일러에서 알려줍니다.

4) -Wall 플래그없이 컴파일하려는 경우 프로그램에 필요한 모든 헤더가 있는지 확인하십시오. 포함 된 항목 :

//mmap 
#include <sys/mman.h> 
//printf 
#include <stdio.h> 
//open 
#include <stdlib.h> 
#include <sys/types.h> 
#include <fcntl.h> 
//sysconf 
#include <unistd.h> 

희망 사항이 도움이 될 것입니다.

P. 이 게시물을 작성한 직후에 문제를 해결 한 것을 보았습니다 (하지만 여전히 문제는 이해할 수 없습니다). 그래서 다른 채우기가 비슷한 동작을하지만 다른 문제가있는 경우를 대비하여이 코드를 남겨 두십시오.

관련 문제