я работаю с ядром Linux 4.4.0 в Ubuntu 16.04.1 LTS (и я не профессионал в UNIX). я написал модуль ядра для чтения из PCIE и приложение пользовательского пространства для взаимодействия с этим драйвером, и все это прекрасно работает.
Я использую механизм рассеяния. приложение выдает указатель диска на выделенную память и использование драйвера get_user_pages чтобы извлечь страницы из этой виртуальной памяти, затем я записываю эти страницы где-то в согласованной памяти для устройства, и устройство выполняет передачу и уведомляет меня прерыванием.
но есть проблема с освобождением памяти. Когда приложение в пользовательском пространстве завершает свою работу, оно должно освободить () большую память (около 1 ГБ кучи памяти, которую я создаю через malloc в пользовательском пространстве и передать ее драйверу для передачи данных). хотя free () выполняется успешно, но я вижу (через htop) 1G памяти не очищается от оперативной памяти. даже если я закрою приложение, эта память все еще не освобождена, похоже, произошла утечка памяти. переустановка драйвера не работает. (приложение закрывается полностью успешно).
я подумал, может быть из-за того, что я передаю эту память модулю ядра, а затем программируемому устройству, владение памятью больше не для ОС. Если это правда, есть ли способ изменить владение памятью? dma_sync_single_for_cpu делать?
Я хочу знать, как я могу освободить эту память без перезагрузки всей операционной системы? и почему это происходит, и что является правильным решением?
большое спасибо 🙂
Задача ещё не решена.
Других решений пока нет …