LINUX.ORG.RU

Изменение укаазателя mm, задачи.

 


0

2

Kод весь не привожу, его слишком много чтоб просматривать, да и он полностью отлажен и оттестирован.(опишу позже как тестировал)
Вопрос, да и сама проблема связана с вызовом функции do_mmap_pgoff
А конкретнее её вызов для процесса пользовательского пространства, из потока ядра. Проблема заключается в том, что эта функция работает с значением current->mm (в исходниках функции, да и в остальных вызываемых ей функциях, работа производится с current).
И вот что имеем:
Поток ядра, вызывает функцию do_mmap_pgoff для процесса temperature_indicator.
У потока ядра есть указатель на struct task_struct датчика температуры: struct task_struct *temperature_indicator_ptr; // указатель инициалезируется при запуске программы
Осуществляется проверка статуса процесса «temperature_indicator» закончил ли работу? активен ли? Если активен, то получаем блокировку для его
down_write(&temperature_indicator_ptr->mm->mmap_sem);
Далее делаю так, чтоб можно было вызвать функцию сurrent->mm = temperature_indicator_ptr->mm
(Понимаю что так не стоит делать, но как тогда быть?) Меня очень смущает такой способ, вызова функции
И пробуем выделить дополнительное пространство для процесса! (одну страницу памяти)
do_mmap_pgoff(NULL, addr, 1, PROT_READ, MAP_PRIVATE, 0);
addr - это конечный адрес кучи процесса.
Данное действие заканчивается успешно, ура! Память выделена, с ней можно работать.

(далее восстанавливаю указатель в сurrent->mm и снимаю блокировку с mmap_sem)
Да тут кроется проблема, которая проявляется при тестах.
Система зависает (рано или поздно). именно изза вызова do_mmap_pgoff ! Если этот вызов не делать то программа работает стабильно.(крутил сутками! тестирование)
тесты заключаются в бесконечном запуске программы, и её закрытии (несколько баш скриптов запускаю, один бесконечно прогу запускает, другой делает постоянно с разной периодичностью killall «temperature indicator info»)

Получается плавающая ошибка, которая «примерно известно» при каких условиях проявляется, но именно что примерно.
Есть какиенить идеи? что может быть? (напоминаю, только при вызове do_mmap_pgoff зависание периодическое происходит)
Может какието блокировки нужно ставить? на процесс? память? Подскажите!


ты лучше пример кода напиши, достоевский.

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