Tôi đã cố gắng để cổng vài trình điều khiển linux và nhận ra rằng có sự khác biệt đáng kể giữa hạt nhân phiên bản 2.4 và 2.6 của Linux.Sự khác biệt giữa module_init và init_module trong mô-đun hạt nhân Linux là gì?
Trong phiên bản 2.4 của hạt nhân, các lập trình mô-đun là như sau -
#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");
}
Nhưng, với phiên bản 2,6 của hạt nhân, sau đây phải được thực hiện cho các module -
#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);
Lợi thế của những thay đổi đó trong Kernel 2.6 là gì và tại sao thay đổi đó được yêu cầu trong kernel 2.6 của Linux?
Tuyên bố 2.4 ngụ ý rằng bạn không bao giờ có thể xây dựng mô-đun vào hệ thống (vì các khai báo không tĩnh). – stsquad
Đây là lời giải thích rất tốt cho module_init: http://stackoverflow.com/questions/18605653/linux-module-init-vs-core-initcall-vs-early-initcall – user2311046