Я сейчас пытаюсь получить доступ к общей памяти UIO через memcopy.
Мой подход такой:
- open соответствующее устройство
- mapпамять через mmap со спецификацией смещения N * getpagesize ()
- memcopy / memset до указателя, которыйвозвращается из mmap
Я попытался также с помощью ftruncate после шага 2, что привело к ошибке.
memcopy / memset вызывает ошибку шины , которая обычно являетсяпризнак записи границ файлов.
Через cat / proc / 'pid' / maps Я вижу, что есть сопоставление для / dev / uioX Также / sys/ class / uio / uioX / maps / имеет два каталога карт, из которых я пытаюсь получить доступ ко второму ( map1 , поэтому N = 1 )
Являюсь ли яупустить что-то? Придется ли мне отображать полный размер памяти, указанной в / sys / class / uio / uioX / maps / map1 / size?
Я не смог найти ни одного примера для доступа к памяти через memcopy, есть ли что-то, что мешает memcopy в памяти mioped UIO?
Источники
unsigned char* GetMemPtr(const char *name, unsigned long Size)
{
long fd;
long truncret;
void* MemPtr;
unsigned long offst;
printf("Opening: %s with size %u\n" , name, Size);
fd = open(name, O_RDWR);
if (fd < 0) {
printf("Error: open : %u : %s\n", fd, strerror(errno));
}
offst = 1 * getpagesize();
/*truncret = ftruncate(fd, offst + Size);
if (truncret < 0)
{
printf("Error: ftruncate : %s : %d\n", strerror(errno), truncret);
}*/
MemPtr = mmap(0, Size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offst);
if (MemPtr == MAP_FAILED)
{
printf("Error: mmap : %p : %s\n", MemPtr, strerror(errno));
}
//MemPtr = MemPtr + offst;
printf("Mem pointer is %p\n", MemPtr);
memset(MemPtr, 0, Size);
printf("Pointer is : %p\n" , MemPtr);
return (unsigned char*) MemPtr;
}
Результатына выходе:
Открытие: / dev / uio0 с размером 4096
Память указателя 0xffff89232000
Ошибка шины (ядро сброшено)