реклама на сайте
подробности

 
 
> отображения буфера, из ядра в пользовательское пространство
Dubov
сообщение Aug 15 2012, 13:09
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Выделяю буфер в драйвере ядра как kzalloc(). kzalloc принимает аргументы смещения, размера и дескриптор файла.
нужно отобразить в память пользовательского пространства (наверное через mmap) этот буфер. Как это сделать? Какие аргументы должна принять функция mmap для отображения только буфера.

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Idle
сообщение Aug 15 2012, 18:04
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Dubov @ Aug 15 2012, 17:09) *
kzalloc принимает аргументы смещения, размера и дескриптор файла.

размер и gfp она принимает

http://www.scs.ch/~frey/linux/memorymap.html
Go to the top of the page
 
+Quote Post
kurtis
сообщение Aug 15 2012, 18:17
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



include/linux/slab.h
Код
/**
* kzalloc - allocate memory. The memory is set to zero.
* @size: how many bytes of memory are required.
* @flags: the type of memory to allocate (see kmalloc).
*/
static inline void *kzalloc(size_t size, gfp_t flags)
{
        return kmalloc(size, flags | __GFP_ZERO);
}

Go to the top of the page
 
+Quote Post
Dubov
сообщение Aug 16 2012, 05:41
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Спасибо всем за ответы. Просто я опасаюсь, что если я отображу память как mmap(), не отобразится ли что-то ненужное кроме буфера из драйвера.
Конкретный вопрос: если я выделяю память в функции инициализации драйвера и затем в пользовательском пространсвте просто делаю mmap с нулевым смещением и размером буфера(который виделил в драйвере), могу ли я быт уверен, что получу доступ именно к нужному буферу, так как подозреваю что память драйвера содержит не только буфер.

P.S. Прошу сильно не пинать. С Linux'ом я только начинаю знакомиться.
с аргументами kzalloc я конечно напутал, дескриптор файла принимает mmap )) прошу простить)

Сообщение отредактировал Dubov - Aug 16 2012, 05:45
Go to the top of the page
 
+Quote Post
sasamy
сообщение Aug 16 2012, 06:18
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Dubov @ Aug 16 2012, 09:41) *
Просто я опасаюсь, что если я отображу память как mmap(), не отобразится ли что-то ненужное кроме буфера из драйвера.


Это уже от вас зависит - что вы отобразите в своем драйвере, что вам мешает проверять не выходит ли запрашиваемый из юзерспейс размер буфера за пределы выделенного в драйвере региона памяти ? учитывайте при этом что выделение памяти в ядре и отображение ее в виртуальном адресном пространстве процесса или ядра всегда происходит кратно странице, что для ARM будет 4096 байт.

Код
static int xxx_mmap (struct file *file, struct vm_area_struct *vma)
{
    unsigned long size = vma->vm_end - vma->vm_start;

    if (size > kmalloc_area_size)
        return -ENOMEM;

    if (remap_pfn_range(vma,
                        vma->vm_start,
                        virt_to_phys((void *)kmalloc_area) >> PAGE_SHIFT,
                        size,
                        vma->vm_page_prot))
        return -EAGAIN;

    return 0;
}

static const struct file_operations xxx_fops = {
...
    .mmap    = xxx_mmap,  
};



Цитата
P.S. Прошу сильно не пинать. С Linux'ом я только начинаю знакомиться.


вы выбрали очень неэффективный метод обучения - вместо того чтобы почитать документацию на процессор, книги или статьи по по устройству ядра Linux и написанию драйверов коих и на русском сейчас великое множество - идете на форум с кучей вопросов.

Сообщение отредактировал sasamy - Aug 16 2012, 06:20
Go to the top of the page
 
+Quote Post
Dubov
сообщение Aug 16 2012, 06:27
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Наверное вы правы. Но ответов на этот конкретный вопрос несмог найти в "Linux device drivers", хотя книга очень толковая. В ней узнал про такие вещи как:
Инициализация, обработка прерываний, выделение памяти в ядре, оформление обработки управляющих команд ioctl, но некоторых ньансов не найти в книге - это так называемые тонкости.

Сообщение отредактировал Dubov - Aug 16 2012, 06:36
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Aug 16 2012, 07:58
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



рекомендую:
http://www.linux.org.ru/forum/development/1488621
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 23:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016