>>>Подскажите пожалуйста!!! Как в модуле ядра выделить много (~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