Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: отображения буфера
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Dubov
Выделяю буфер в драйвере ядра как kzalloc(). kzalloc принимает аргументы смещения, размера и дескриптор файла.
нужно отобразить в память пользовательского пространства (наверное через mmap) этот буфер. Как это сделать? Какие аргументы должна принять функция mmap для отображения только буфера.

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

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

http://www.scs.ch/~frey/linux/memorymap.html
kurtis
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);
}

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

P.S. Прошу сильно не пинать. С Linux'ом я только начинаю знакомиться.
с аргументами kzalloc я конечно напутал, дескриптор файла принимает mmap )) прошу простить)
sasamy
Цитата(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 и написанию драйверов коих и на русском сейчас великое множество - идете на форум с кучей вопросов.
Dubov
Наверное вы правы. Но ответов на этот конкретный вопрос несмог найти в "Linux device drivers", хотя книга очень толковая. В ней узнал про такие вещи как:
Инициализация, обработка прерываний, выделение памяти в ядре, оформление обработки управляющих команд ioctl, но некоторых ньансов не найти в книге - это так называемые тонкости.
TigerSHARC
рекомендую:
http://www.linux.org.ru/forum/development/1488621
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.