Я пытался портировать немного драйверов Linux и понял, что существуют существенные различия между версией 2.4 и 2.6 ядра Linux.
В 2,4 версиях ядра программирование модуля было как ниже -
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hi \n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Bye \n");
}
Но с 2,6 версиями ядра следующее должно быть сделано для модулей -
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hi_init(void)
{
printk(KERN_ALERT "Hi \n");
return 0;
}
static void hi_exit(void)
{
printk(KERN_ALERT "Bye \n");
}
module_init(hi_init);
module_exit(hi_exit);
Каково преимущество таких изменений в Ядре 2.6 и Почему то изменение требовалось в ядре 2.6 из Linux?
Если вы посмотрите на определение новых функций:
/* Each module must use one module_init(). */
#define module_init(initfn) \
static inline initcall_t __inittest(void) \
{ return initfn; } \
int init_module(void) __attribute__((alias(#initfn)));
/* This is only required if you want to be unloadable. */
#define module_exit(exitfn) \
static inline exitcall_t __exittest(void) \
{ return exitfn; } \
void cleanup_module(void) __attribute__((alias(#exitfn)));
Вы увидите, что оно гарантирует, что в него включена правильная кодовая таблица, чтобы эти специальные функции могли быть правильно обработаны компилятором. Это то, что делает внутренний API Linux, он развивается, если есть лучшие способы решения проблемы.
Одним из преимуществ является удобочитаемость. cdrom_init () немедленно сообщает вам, что это вызов init () для драйвера cdrom.