Re[3]: Linux. Драйвер. Память.
От: vitka Россия  
Дата: 22.12.03 11:42
Оценка:
Здравствуйте, 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 чистит память.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.