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

 
 
> отмапить виртуальный адрес ядра в пространство пользователя
novartis
сообщение Jan 28 2016, 10:59
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



В pcie драйвере вызвал функцию pci_alloc_consistent(). Благодаря этому получил два адреса - один виртуальный адрес ядра, другой - физический адрес. Физический адрес сообщил в плис. Плис пишет данные по этому адресу, выставляет прерывание. В обработчике прерывания печатаю содержимое буфера с виртуальным адресом. Вижу свои данные, все работает.

Вопрос 1. Функция pci_alloc_consistent завершается удачно, если размер запрашиваемого буфера не превышает 4 МБайт. С чем это связано, почему не удаётся получить 8 и больше МБайт?

Вопрос 2. Можно ли замапить виртуальный буфер ядра в пространство пользователя?
Это вообще возможно?
Как я понимаю, физическая память линейна и поделена на траницы. Эти страницы отображаются в виртуальную память в произвольном порядке.
Вызвав функцию pci_alloc_consistent, я зарезервировал большое количество подряд идущих страниц физической памяти и отобразил их в виртуальной памяти.
В виртуальной памяти пользователя свой порядок страниц, это меня и напрягает, получится ли просто замапить виртуальный буфер ядра в виртуальный буфер пользователя, у пользователя как то тоже нужно пересортировать страницы, чтобы они в линию выстроились в физической памяти.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
novartis
сообщение Mar 10 2016, 11:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Все еще не решил проблему с ограничением в 4 МБайт при выделении буфера функцией dma_alloc_coherent. В интернетах пишут про следующие способы:
1. С помощью опции mem для ядра.
Попытался воспользоваться этим.
Для grub добавил строчку mem=512M. После ребута все стало сильно тормозить. Я так понял этой строчкой я указал линуксу использовать только 512M в качестве ОЗУ.
Поставил mem=2G. Тормоза исчезли, но буфер в 8МБайт не выделился.
Еще пробовал ставить mem=2G memmap=2G$3G. Тоже не помогло.
С помощью mem опции вообще можно 8мбайт выделить?

2. Второй способ - увеличить параметр MAX_ORDER=11 в исходниках ядра и перекомпилить ядро.
Пишут, что ядро может стать не стабильным.
Завтра этот способ проверю.

3. Применить патчи для ядра. Как это делать даже не знаю.


Может кто что посоветует, подскажет?


По условиям задачи нужно иметь очень большой непрерывный буфер в пространстве пользователя, в который плис будет писать по pcie.
С помощью dma_alloc_coherent мне это удалось сделать.
Сейчас драйвер уже не трогал с месяц. Все в нем работает.
А вот ограничение в 4мбайт доставляет, хочется большего.

cmem еще вечером посмотрю, что они там делают.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 00:26
Рейтинг@Mail.ru


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