Я очень новичок в разработке модулей ядра Linux и у меня есть вопрос относительно структуры модуля. Рассмотрим следующий простой модуль:
Случай 1.
init.h
#include <linux/module.h>
int __init bda_init(void);
void __exit bda_exit(void);
module_init(bda_init);
module_exit(bda_exit);
init.c
#include <linux/module.h>
#include "init.h"
int __init bda_init(void){
printk(KERN_INFO "Init module\n");
return 0;
}
void __exit bda_exit(void){
printk(KERN_INFO "Exit module\n");
}
* 1014Проблема, о которой я подумал при реализации инициализации таким образом, заключалась в том, что функции
bda_init
и
bda_exit
оба объявлены с внешней связью и поэтому должны быть связаны в коде ядра. Я осмотрел
/proc/kallsyms
$ grep "bda" /proc/kallsyms
0000000000000000 r _note_6 [bda_md]
0000000000000000 d __this_module [bda_md]
0000000000000000 t cleanup_module [bda_md]
0000000000000000 t bda_exit [bda_md]
и обнаружил, что bda_exit
было указано в каллсимах, но bda_int
не было.
Случай 2.
При переписывании модуля просто как
#include <linux/module.h>
static int __init bda_init(void){
printk(KERN_INFO "Init module\n");
return 0;
}
static void __exit bda_exit(void){
printk(KERN_INFO "Exit module\n");
}
module_init(bda_init);
module_exit(bda_exit);
Я думаю, что bda_exit
исчезнет из kallsyms
, но это не так. Kallsyms абсолютно одинаковы:
$ grep "bda" /proc/kallsyms
0000000000000000 t bda_exit [bda_md]
0000000000000000 r _note_6 [bda_md]
0000000000000000 d __this_module [bda_md]
0000000000000000 t cleanup_module [bda_md]
ВОПРОС : Почему объявление static
не влияет на ksyms
, введенное модулем, и является ли онообычная практика объявлять обратные вызовы init / exit в заголовке при реализации LKM?