что __exit делает при выгрузке модуля ядра в linux?

1044
Usr1
static void __exit hello_exit(void) { printk(KERN_ALERT "Goodbye\n"); }  module_exit(hello_exit); 

__exitМодификатор отмечает код как только модуль выгрузки (вызывая компилятор, чтобы поместить его в специальный раздел ELF). Если ваш модуль встроен непосредственно в ядро ​​или если ваше ядро ​​настроено на запрет выгрузки модулей, отмеченные функции __exitпросто отбрасываются. По этой причине отмеченная функция __exitможет вызываться только при разгрузке модуля или времени выключения системы; любое другое использование является ошибкой.

Я не понимаю, для чего __exit, пожалуйста, объясните сценарий, чтобы у меня была четкая картина.

0
Вопросы, относящиеся к программированию и разработке программного обеспечения, не относятся к теме, см. [Какие темы я могу задать здесь?] (Http://superuser.com/help/on-topic). Попробуйте [SO], но, пожалуйста, сначала прочитайте [Как мне задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask). DavidPostill 9 лет назад 0

1 ответ на вопрос

1
sawdust

When an application program is loaded and executes, it can acquire resources (e.g. request memory, open files). When the program terminates, the kernel can deallocate those resources (if the program didn't clean up after itself) because the application executes in user mode whereas the kernel executes in supervisor mode.

A kernel loadable module can be loaded and unloaded in a manner similar to an application program. But the kernel cannot (or does not) supervise the kernel module, since the module is part of the kernel and also executes in privileged mode as part of the kernel.

Therefore before a kernel module is unloaded, it must deallocate any and all resources it has acquired, as well quiesce any hardware that it may have activated. The exit routine is the last chance that the module has to perform these operations, or it may leave the system in an unstable state.

Это в значительной степени подводит итог. Чтобы удалить модуль, вызовите `modprobe -r tun` или` rmmod tun`. Daniel B 9 лет назад 0
Работает нормально без упоминания __exit, тогда в чем разница? Usr1 9 лет назад 0
@ v123 Вероятно, это в основном синтаксический трюк с сахаром и макросами. Daniel B 9 лет назад 0

Похожие вопросы