LINUX.ORG.RU

DMA (bus master) buffer from user-space.


0

1

Здравствуйте!

Есть задача: для 1-4 PCI плат выделить по 64Mб непрерывной памяти, иметь доступ к каждому из блоков этой памяти из user-space и его физический адрес для передачи соотвествующей плате. ОС: Ubuntu 11.01 x86 Kernel 3.0.0-12-generic.

Блоки памяти могут выделяться кусочно (сейчас необходимо сделать по 2 банка 32Мб для каждой платы, но хорошо бы иметь возможность изменять объем банков и их количество).

Я предполагаю, что необходимо делать это с помощью функции dma_alloc_coherent(), из которой будет получаться dma_addr_t* - физический адрес, который можно передать в устройство, и указатель на памяти в kernel-space. Далее этот указатель отправляется в user-space с помощью mmap().

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

Вопрос: какими средствами лучше сделать эту операцию, чем выделать память? Как лучше отправить указатель на выделенную память в user-space (с учетом того, что банков памяти может быть много и нужно иметь указатель на каждый из них)?

Спасибо.


Ответ на: комментарий от tailgunner

так что я даже не уверен в применимости remap_pfn_range здесь (да и вообще, разрешено ли использовать remap_pfn_range на результатах get_free_pages? Речь не о x86)

Линуксовое ядро линейную модель использует. Так что если не highmem, то pfn_range работает.

mv ★★★★★
()
Ответ на: комментарий от tailgunner

Таки как же правильно делать? Для не x86 и x86-64 мне пока не приходится писать, но как быть для других архитектур?

ksanto
() автор топика
Ответ на: комментарий от mv

Не подскажете заодно на счет реализации маппирования через .ioctl. В варианте через .mmap структура struct vm_area_struct *vma уже приходит заполненная, в частности поле vma->vm_start. Как правильно реализовать в случае .ioctl? Эту структуру динамически выделять и самостоятельно заполнять?

ksanto
() автор топика
Ответ на: комментарий от ksanto

Таки как же правильно делать?

Насчет твоей задачи со здоровенным массивом линейной памяти - не знаю. У меня массив поменьше, нелинейный (пишется через s/g), и я использую mmap и vm_insert_page.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Даже если у тебя два блока в разных частях памяти?

Если допустимы два буфера в разных частях, то мы тут уже второй день стреляем из пушек по воробьям

ttnl ★★★★★
()
Ответ на: комментарий от ksanto

Эти закрытия и открытия относятся к file_operations_struct, т.е. к файлу. Одновременный доступ процессов к файлу символьного устройства мне наоборот нужно иметь.

Ок

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

Тогда используй такой же механиз в паре mmap+«close из struct vm_operations_struct».

А как тогда правильно маппировать в user-space выделенный буфер?

remap_pfn_range - вполне годно

ttnl ★★★★★
()
Ответ на: комментарий от tailgunner

Даже если у тебя два блока в разных частях памяти?

Разумеется, *pfn_range работает для range, а не для какого-нибудь вшивого set или list, как следует из названия.

mv ★★★★★
()
Ответ на: комментарий от tailgunner

Это было в условии задачи :)

Кстати, заметил, мы часто обсуждаем эту тему ;) Раз в три месяца как минимум

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Кстати, заметил, мы часто обсуждаем эту тему ;) Раз в три месяца как минимум

Все написали по типично-шаблонному драйверу и теперь мнят себя нииабтса крутыми кернель хакерами, регулярно обсасывая детали. Это как английский клуб джентельменов, с камином, креслами, пледами и бренди.

mv ★★★★★
()
Ответ на: комментарий от mv

Все написали по типично-шаблонному драйверу и теперь мнят себя нииабтса крутыми кернель хакерами, регулярно обсасывая детали. Это как английский клуб джентельменов, с камином, креслами, пледами и бренди.

Я думаю, каждый про себя сам знает, чего он стоит, и сколько у него принятых патчей в ванильном ядре.

Обычные драйверы сами по себе - штука несложная. Гораздо интереснее заниматься подсистемами и интерфейсами. Но человек, способный работать с ними, не будет задавать вопросы на этом форуме.

Ты выложил код, мы его предметно обсудили. Вот собственно и все. Если есть желание обсудить что-нибудь ещё на русском языке, у меня есть небольшая тема про планировщик. Есть желающие?

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Ты выложил код, мы его предметно обсудили. Вот собственно и все.

Ну так я и не против.

Если есть желание обсудить что-нибудь ещё на русском языке, у меня есть небольшая тема про планировщик. Есть желающие?

Давай.

mv ★★★★★
()
Ответ на: комментарий от mv

Ок.

http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=blob;f=kernel...

Ф-я set_cpus_allowed_rt().

dequeue/enqueue достаточно делать в случае, если процесс перешел из множества (old weight <= 1) во множество (weight > 1) и наоборот.

Однако стоит проверка weight != p->rt.nr_cpus_allowed.

Вот, например, переход old_weight=3 -> weight=4 принципиально положение вещей не меняет. Процесс вышивается и вшивается снова.

Меняется только внутреннее представление. Т.е. эффект есть, но такой же эффект тогда должен быть и при переходе 4 -> 4, а его нет.

Ну чо, давай обсуждать.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Твой шаблонный драйвер работает на арме? ;)

Про ARM не знаю (говорят, там с кэшами адЪ), но на PowerPc точно работает.

tailgunner ★★★★★
()
Ответ на: комментарий от ttnl

Может быть все-таки кто-то подскажет про реализацию маппирования не через .mmap (через .ioctl в частности)? Интересно, как заполнить структуру vm_area_struct для remap_pfn_range в этом случае. В варианте через .mmap структура vm_area_struct уже приходит заполненная, в частности поле vma->vm_start. Эту структуру динамически выделять и самостоятельно заполнять?

ksanto
() автор топика
Ответ на: комментарий от tailgunner

Про ARM не знаю (говорят, там с кэшами адЪ), но на PowerPc точно работает.

Тады ДрАйвЕр В пОряДе

ttnl ★★★★★
()
Ответ на: комментарий от ksanto

Может быть все-таки кто-то подскажет про реализацию маппирования не через .mmap

А что с ним не так?

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Все с ним так. Просто интересно знать. Ведь существует же такая реализация, может пригодиться.

ksanto
() автор топика
Ответ на: комментарий от ksanto

Все с ним так. Просто интересно знать. Ведь существует же такая реализация, может пригодиться.

Тогда пожалуй это не ко мне

ttnl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.