Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выделение памяти
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
doom13
Приветствую.
Необходимо выделить под буферы DMA 32 МБ памяти (128 буферов, память выделяется функцией dma_zalloc_coherent с флагом GFP_KERNEL), система отдаёт около 16 МБ, далее dma_zalloc_coherent возвращает нулевой указатель.
Содержимое /proc/meminfo:
Код
MemTotal:        1032496 kB
MemFree:         1018988 kB
MemAvailable:    1016792 kB
Buffers:             932 kB
Cached:             3648 kB
SwapCached:            0 kB
Active:             4380 kB
Inactive:            888 kB
Active(anon):        700 kB
Inactive(anon):       24 kB
Active(file):       3680 kB
Inactive(file):      864 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:        270336 kB
HighFree:         268172 kB
LowTotal:         762160 kB
LowFree:          750816 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:           776 kB
Mapped:             2468 kB
Shmem:                36 kB
Slab:               3740 kB
SReclaimable:       1184 kB
SUnreclaim:         2556 kB
KernelStack:         400 kB
PageTables:           92 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      516248 kB
Committed_AS:       2088 kB
VmallocTotal:     245760 kB
VmallocUsed:        3544 kB
VmallocChunk:     143740 kB
CmaTotal:          16384 kB
CmaFree:           16112 kB

после старта драйвера:
Код
CmaTotal:          16384 kB
CmaFree:             104 kB

Возможно ли увеличить размер CmaTotal?
Эдди
В /etc/sysctl.conf ограничений по памяти нет?
doom13
Цитата(Эдди @ Dec 29 2016, 14:16) *
В /etc/sysctl.conf ограничений по памяти нет?

В системе нет такого файла, в Ubunt-e на ПК есть, а в системе на плате нет?
Jury093
Цитата(doom13 @ Dec 29 2016, 13:38) *
Необходимо выделить под буферы DMA 32 МБ памяти (128 буферов, память выделяется функцией dma_zalloc_coherent с флагом GFP_KERNEL), система отдаёт около 16 МБ, далее dma_zalloc_coherent возвращает нулевой указатель.

вероятно у вас прописаны дефолтные 16МБ
в корне исходников ядра:
Код
cat .config | grep CMA

и смотрите параметр CONFIG_CMA_SIZE_MBYTES
aaarrr
Добавьте к параметрам ядра cma=32M.
nill
Цитата(aaarrr @ Dec 29 2016, 21:41) *
Добавьте к параметрам ядра cma=32M.

Тут стоит добавить, что CMA прозрачно используется через DMA API, и все драйверы, запрашивающие память через dma_alloc_coherent, получат свой кусочек. Так что 32M может и не хватить с учётом того, что в выводе /proc/meminfo кто-то уже откусил ~200 кб.
doom13
Спасибо. Проблема была именно в ограничении размера памяти при конфигурации ядра.
Увеличил размер CMA до 128 МБ - перестал работать мой драйвер, возвращаю стандартные 16 МБ - опять всё работает? 64, 32 МБ - драйвер не работает.
doom13
Приветствую.
Увеличиваю размер CMA - получаю какое-то странное поведение системы. На что ещё может влиять данный параметр (CONFIG_CMA_SIZE_MBYTES)?
Используется плата zc706, Vivado 2015.4, Petalinux 2015.4, в системе используется отладчик ILA и при увеличении размера CMA даже он отваливается, но при этом файл прошивки FPGA не изменялся, меняется только образ ядра Linux и rootfs. Как???
krux
тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом.
Общая концепция которого примерно следующая:
Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!".

Вам придется выяснить, какие требования налагают разные ОС на выделение памяти для передачи данных из "железа" в пространство памяти ОС и обратно.
И только после этого проектировать обмен.

Итого, может оказаться, что scatter-gather dma with lots of 16k linear alloc()-ed pages is better solution for your application with underlying HW acquisition system responding positively to this method as well.
doom13
Цитата(krux @ Jan 3 2017, 17:36) *
тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом.
Общая концепция которого примерно следующая:
Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!".

Вам придется выяснить, какие требования налагают разные ОС на выделение памяти для передачи данных из "железа" в пространство памяти ОС и обратно.
И только после этого проектировать обмен.

Итого, может оказаться, что scatter-gather dma with lots of 16k linear alloc()-ed pages is better solution for your application with underlying HW acquisition system responding positively to this method as well.

Вы не правильно поняли вопрос, необходимо выделить для SgDMA два буфера. Каждый буфер из 128 дескрипторов по 128 кБ.
Память уже выделяется, при конфигурации ядра с опциями предложенными выше, но... (см. предыдущий пост)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.