LINUX.ORG.RU

Память пользовательского пространства

 


0

4

Замучался уже, методом перебора действовать.
Модуль работает с памятью процесса пользовательского уровня. Получает указатели в этой памяти, и тд.
Есть беда, когда пользовательский процесс завершается, то модуль не знает об этом и продолжает работать с mm которой уже нету. Происходит порча памяти, и зависание. Пробовал в mm счётчики (mm_count, mm_users)использования увеличивать. Не спасает. при завершении процесса, очищается память mm , а в task_struct указатель mm cтановится равен null
Как исправить проблему? как уберечь mm от очистки до завершения работы модуля с данной памятью?

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

(как я понял у тебя какой то быдлокод.)

rezedent12 ☆☆☆ ()
Ответ на: комментарий от UVV

Не моя ситуация (

rezedent12
Ну тык толку то проверять, процесс завершился или нет?
Cейчас поясню
1)Запускается пользовательский процесс, у него есть mm с данными.
2)Модуль получает указатели на эти данные, и начинает работу с ними.
3)В тот момент когда модуль начал обработку данных, происходит завершение пользовательского процесса, и ядро унечтожает память mm c которой производит работу модуль.
Получается, модуль продолжает работу с разрушенными данными (которые уже ядро унечтожило).
Вот мне нужно както блокировку поставить на mm процесса. так, чтоб при завершении пользовательской программы, и в то время когда с этой памятью работает модуль, ядро не освобождало данные mm.
Как это сделать?
И ещё вопрос дополню, после отработки модуля, и завершения процесса, ядро само освободит память занимаемую mm?

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

А как он завершается, если у тебя идет работа с данными?

И если ты работаешь с данными ты из не копируешь из us?

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

Не копирую. Тупо доступ к пользовательскому пространству, без всяких копи ту юзер и тд. Чистая работа с памятью процесса прикладного уровня. (при этом нигде не помечаю, что память процесса в ядре используется (как это сделать? что именно указать? обновить?))

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

Попробуй развернуть зависимость. Т.е. пусть память для процесса предоставляет модуль, он же ей и владеет

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

preempt_disable/preempt_enable и, по хорошему, get_user/put_user и вообще вся компания из uaccess.h

anonymous ()
Ответ на: комментарий от Aresss

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

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

на армах, апример, это приводит к полому писцу - не нужо так делать, а если и делать то с оглядкой на v4l

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

можно чуть подробнее про писец?

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