Я пишу драйвер Linux, который выделяет некоторую память и прикладное пространство пользователя mmap()
с этой памятью.Правильное освобождение и разворачивание памяти ядра
Теперь я пишу обработчик выхода для этого модуля, и я пытаюсь выяснить, какие существуют безопасные предположения.
Прежде всего, можно ли предположить, что когда вызывается обработчик выхода модуля ядра, все память не отображается (будь то приложением или ядром)? Или мне нужно вручную удалить карту ядра в драйвере ядра, прежде чем освободить память?
Я спрашиваю об этом, так как ядро должно знать, выходит ли модуль, и ядро также обрабатывает процесс unmapping. Если ядро обрабатывает unmapping до вызова обработчика выхода, я могу просто освободить память. Если это верно, и если приложение пользовательского пространства попыталось получить доступ к этой памяти, тогда приложение будет иметь ошибку сегментации. Это связано с тем, что виртуальные адреса либо больше не указывают на действительную физическую память, либо у процесса нет разрешения на доступ к виртуальным адресам на этой странице (предполагая, что ядро не отображает память). То же самое произойдет, если драйвер ядра отключит память. Это правда?
Я подозреваю, что все, что вы выделите и на карте, будет нести ответственность за очистку себя. Не уверен, хотя. – Wug
Я был уверен в том, что для выделения, но неопределенный для сопоставления, так как это делается пользователем, а 'munmap()' полностью обрабатывается ядром. – Joshua