LINUX.ORG.RU

как правильно читать промаппленный обьект?


0

0

В приложении успешно маппится девайс
ptr = mmap(0, mmapsize, PROT_READ, MAP_SHARED, devd, 0);
и при попытке прочитать его содержание
printf("%8d", ptr[0]); или
printf("%8d", *ptr);
получаем Segmentation fault.

Везде пишут, что можно обращаться к области памяти, на которую указывает ptr. Как правильно это сделать?

Ответ на: комментарий от idle

Я же написал успешно, значит не -1.

sts
() автор топика
Ответ на: комментарий от anonymous

> А по-подробнее прогу можно.

Кусок из драйвера:

static int device_mmap(struct file *file, struct vm_area_struct *vma) {
   BOARD_STRUCT *b;
   unsigned long addr;
   int size;
   l_circ_buf *fb;

   b = (BOARD_STRUCT*) file->private_data;
   if(!b) return -1;
   size = vma->vm_end - vma->vm_start;
   if(!(vma->vm_flags & VM_READ)) return -EINVAL;

   if(vma->vm_flags & VM_WRITE)
      fb = &b->OutBuf;
   else
      fb = &b->InBuf;

   if(size > fb->alloc_size) return -EINVAL;
   addr = virt_to_phys(b->InBuf.data);
   if (debug > 0) printk("mmap: addr = %d\n", addr);
   if(remap_page_range(
      vma,
      vma->vm_start,
      addr,
      size,
      vma->vm_page_prot)) return -EAGAIN;
   return addr;
}

sts
() автор топика
Ответ на: комментарий от sts

(лишние подробности убрал)

#include <sys/mman.h>

int main(int argc, char **argv) {
    int *ptr;
    int devd, mmapsize;
    LDSP_HANDLE dev;

    mmapsize = 0x20000; // 128K
    devd = ldspOpen(&dev, dname, LDSP_ADC);
    (открывается девайс)

    ... запускается заполнение буфера InBuf.data
    (слежу за указателем буфера, ошибки нет)    

    ptr = mmap(0, mmapsize, PROT_READ, MAP_SHARED, devd, 0);
    (возвращаемый указатель проверяется, ошибки нет)

    printf("%8d", *ptr);
    (здесь имеем Segmentation fault)

    munmap(ptr, mmapsize);
}

sts
() автор топика
Ответ на: комментарий от sts

device_mmap() должен возвращать 0 в случае успеха,
а вы возвращаете addr. этот addr и возвращается
из mmap как как ошибка, но перед этим do_mmap_pgoff
сделает zap_page_range на этот vma, к тому же этот
addr физический.

еще одна ошибка в том, что вы не смотрите на vm_pgoff,
хотя здесь это не проявляется.

idle ★★★★★
()
Ответ на: комментарий от idle

> device_mmap() должен возвращать 0 в случае успеха

Точно. Это и была ошибка.

> еще одна ошибка в том, что вы не смотрите на vm_pgoff, > хотя здесь это не проявляется.

А где можно об этом подробнее почитать?

sts
() автор топика
Ответ на: комментарий от sts

> > еще одна ошибка в том, что вы не смотрите на vm_pgoff,
>
> А где можно об этом подробнее почитать?

да черт его знает, может у Рубини есть.
но это просто. vm_pgoff это смещение в файле,
последний параметр mmap(), его нужно учитывать
при вычислении addr и проверок с длиной.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.