URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3144
[ Назад ]

Исходное сообщение
"Linux: Выделение памяти"

Отправлено karak , 08-Июл-04 23:44 
Подскажите пожалуйста!!! Как в модуле ядра выделить много (~128M и более) физической памяти, сегментами по 4K - 64K (желательно 64K), чтобы эти сегменты можно было спроецировать в пространство пользователя вызовом mmap для каждого сегмента. Спасибо...

Содержание

Сообщения в этом обсуждении
"Linux: Выделение памяти"
Отправлено Murr , 09-Июл-04 00:15 
>Подскажите пожалуйста!!! Как в модуле ядра выделить много (~128M и более) физической
>памяти, сегментами по 4K - 64K (желательно 64K), чтобы эти сегменты
>можно было спроецировать в пространство пользователя вызовом mmap для каждого сегмента.
>Спасибо...

Либо тупо написать свои aops, либо аккуратно все выделенные kmalloc страницы пометить reserved и вызвать remap_page_range (так делает ряд драйверов).


"Linux: Выделение памяти"
Отправлено karak , 13-Июл-04 19:13 
>>Подскажите пожалуйста!!! Как в модуле ядра выделить много (~128M и более) физической
>>памяти, сегментами по 4K - 64K (желательно 64K), чтобы эти сегменты
>>можно было спроецировать в пространство пользователя вызовом mmap для каждого сегмента.
>>Спасибо...
>
>Либо тупо написать свои aops, либо аккуратно все выделенные kmalloc страницы пометить
>reserved и вызвать remap_page_range (так делает ряд драйверов).

Спасибо. А можно спроецировать пмять выделенную pci_alloc_consistent? У меня не получилось.


"Linux: Выделение памяти"
Отправлено karak , 13-Июл-04 23:23 
>>>Подскажите пожалуйста!!! Как в модуле ядра выделить много (~128M и более) физической
>>>памяти, сегментами по 4K - 64K (желательно 64K), чтобы эти сегменты
>>>можно было спроецировать в пространство пользователя вызовом mmap для каждого сегмента.
>>>Спасибо...
>>
>>Либо тупо написать свои aops, либо аккуратно все выделенные kmalloc страницы пометить
>>reserved и вызвать remap_page_range (так делает ряд драйверов).
>
>Спасибо. А можно спроецировать пмять выделенную pci_alloc_consistent? У меня не получилось.

Попробовал таким способом не получается. Может что-то не так? Мой вызов mmap выглядит таким образом:
int xxx_mmap(struct file *filp, struct vm_area_struct *vma )
{

      int x = 0;
        unsigned long offset = VMA_OFFSET(vma);

        vma->vm_flags |= VM_RESERVED;

        if (offset >= __pa(high_memory) || (filp->f_flags & O_SYNC))
                vma->vm_flags |= VM_IO;
// 2.4
#ifdef LINUX_24
        x = remap_page_range(vma, vma->vm_start, offset,
                             vma->vm_end-vma->vm_start,
                             vma->vm_page_prot);
#else
        x = remap_page_range(vma->vm_start, offset,
                             vma->vm_end-vma->vm_start,
                             vma->vm_page_prot);
#endif

    if( x < 0) {
        printk("<0>remap_page_range error.\n" );
          return -EAGAIN;
    }

    return 0;
}

#ifdef LINUX_24     
#define VMA_OFFSET(vma)  ((vma)->vm_pgoff << PAGE_SHIFT)
#else         
#define VMA_OFFSET(vma)  ((vma)->vm_offset)
#endif