Подскажите пожалуйста!!! Как в модуле ядра выделить много (~128M и более) физической памяти, сегментами по 4K - 64K (желательно 64K), чтобы эти сегменты можно было спроецировать в пространство пользователя вызовом mmap для каждого сегмента. Спасибо...
>Подскажите пожалуйста!!! Как в модуле ядра выделить много (~128M и более) физической
>памяти, сегментами по 4K - 64K (желательно 64K), чтобы эти сегменты
>можно было спроецировать в пространство пользователя вызовом mmap для каждого сегмента.
>Спасибо...Либо тупо написать свои aops, либо аккуратно все выделенные kmalloc страницы пометить reserved и вызвать remap_page_range (так делает ряд драйверов).
>>Подскажите пожалуйста!!! Как в модуле ядра выделить много (~128M и более) физической
>>памяти, сегментами по 4K - 64K (желательно 64K), чтобы эти сегменты
>>можно было спроецировать в пространство пользователя вызовом mmap для каждого сегмента.
>>Спасибо...
>
>Либо тупо написать свои aops, либо аккуратно все выделенные kmalloc страницы пометить
>reserved и вызвать remap_page_range (так делает ряд драйверов).Спасибо. А можно спроецировать пмять выделенную pci_alloc_consistent? У меня не получилось.
>>>Подскажите пожалуйста!!! Как в модуле ядра выделить много (~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);
#endifif( 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