1
일부 레지스터를 읽고 쓰는 데 mmap을 사용하는 방법을 배우려고합니다. 다음 코드가 있습니다. 나는 문제가 있어요mmap을 사용하여 읽기/쓰기 레지스터
readback = *((volatile unsigned long *) (mapped_LED_base));
읽기
*((volatile unsigned long *) (mapped_LED_base)) = 0xFFFFF;
그리고 :
#define MY_BASE_ADDRESS 0xC0000000 //Base Address for the PCIe
#define LED_ADDRESS 0x00010000 //Offset for LEDS 0x00010000
#define MAPPED_FILE_SIZE (50 * sizeof(int)) //Guess
#define PAGE_SIZE (sysconf(_SC_PAGESIZE));
void *mapped_region, *mapped_LED_base;
off_t dev_base = ( MY_BASE_ADDRESS | LED_ADDRESS);
unsigned long readback = 0;
먼저 나는
//The O_SYNC option prevents Linux from caching the contents of /dev/mem
memoryFileDescriptor = open("/dev/mem", O_RDWR | O_SYNC);
if (memoryFileDescriptor == -1)
{
printf("Can't open /dev/mem. %d\n", memoryFileDescriptor);
exit(0);
}
// Map one page of memory into user space such that the device is in that page, but
//it may not
// be at the start of the page.
mapped_region = mmap(NULL,
MAPPED_FILE_SIZE, //How to know size?
PROT_READ | PROT_WRITE,
MAP_SHARED, //File may not be updated until msync or munmap is
// called.
memoryFileDescriptor,
dev_base); //How to know the offset?
// get the address of the device in user space which will be an offset from the base
// that was mapped as memory is mapped at the start of a page
mapped_LED_base = mapped_region + dev_base;
그럼 내가 주소로 작성합니다은/dev/MEM을 엽니 다 MAP_SIZE 및 그 오프셋을 알고 있습니까? 그 문서는 그렇게 명확하지 않았습니다. 현재 코드가 세그먼트 오류 오류를 발생시킵니다.
내가 리눅스를 사용하고 있습니다 및 C++
dev_base가 올바른 오프셋입니까? 이것은 mmap이 시작될 주소를 의미합니까? – user1876942
매핑이 시작되는 파일 내의 주소, 예. 실제로 mmap에서 돌아온 포인터가 -1 (의미 오류)이 아닌지 확인 했습니까? –
예, mmap이 -1을 반환하지 않습니다. 그래서 dev/mem을 열고 dev_base 주소에서 50 * ints 길이로 매핑을 시작합니다. 그 주소는 정확하고 왜 충돌하는지 모르겠다. – user1876942