Здравствуйте, unkn2000, Вы писали:
U>Большое спасибо за помощь.
U>Для проверки предложенного вами варианта я написал небольшой драйверок и тестовое приложение.
U>В драйвере в mmap с помощью kmalloc выделяю память (256 байт) и пишу в каждый байт буфера число 55. В приложении вызываю mmap и пытаюсь читать память, выделенную в драйвере. Но чего-то не получается. Вместо записанного числа 55 выводятся одни нули.
U>В драйвере:
U>U>#include <linux/kernel.h>
U>#include <linux/mm.h>
U>#include "common.h"
U>char *KBuffer;
U>int DrvMmap(struct file* File, struct vm_area_struct* vma)
U>{
U> unsigned long i = 0;
U> unsigned long size = vma->vm_end - vma->vm_start;
U>/*
U> Мне необходимы буферы от 3 - 100 KB
U> Поэтому мне достаточно использовать kmalloc (как я понял, эта функция может выделять до 131056 байт)
U>*/
U> KBuffer = kmalloc(size, GFP_KERNEL);
U> if(NULL == KBuffer)
U> {
U> printk("testdrv: error! kmalloc can not alloc memory.\n");
U> return (-1);
U> }
U> for(i = 0; i < 256; i++) KBuffer[i] = 55;
U> return remap_page_range(vma->vm_start,
U> __pa(KBuffer),
U> size,
vma->>vm_page_prot);
U>}
U>В приложении:
U>#define DEVICE "/dev/testdrv"
U>int Fd = -1;
U>char *AddrBuff;
U>int main(void)
U>{
U> mknod(DEVICE, S_IFCHR|S_IRWXU|S_IRWXO, (32<<8) | 0);
U> Fd = open(DEVICE, O_RDWR|O_NONBLOCK|O_NOCTTY);
U> AddrBuff = (char*) mmap(NULL,
U> 256,
U> PROT_READ|PROT_WRITE,
U> MAP_SHARED,
U> Fd,
U> 0);
U> if(AddrBuff == MAP_FAILED)
U> {
U> perror("mmap");
U> if( -1 == unlink(DEVICE)) perror("unlink");
U> return -1;
U> }
U> for(int i = 0; i < 256; i++) printf("%u, AddrBuff[i]);
U> return (0);
U>}
U>
U>Что я сделал не так?
U>Где ошибся?
Всё правильно, т.к. remap_page_range чистит память.