8

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?

+0

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

+1

Đâ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

Trả lời

6

Nếu bạn nhìn vào định nghĩa của các chức năng mới:

/* 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))); 

Bạn sẽ thấy nó đảm bảo các soạn đúng được bao gồm để các chức năng đặc biệt có thể điều trị một cách chính xác bởi trình biên dịch. Đó là những gì API nội bộ của Linux thực hiện, nó phát triển nếu có cách giải quyết vấn đề tốt hơn.

+0

Có, nhưng làm cách nào tốt hơn đường? Các chỉ thị chỉ để làm cho tên người dùng được cung cấp chức năng được thực hiện như một bí danh cho hàm te init_module() – Chethan

+0

Khả năng đọc, tính nhất quán của API, thực thi quy ước. Nói chung, bạn muốn làm cho các bit của tấm nồi hơi của sự phù hợp API khó khăn để vít lên và rời khỏi nhà phát triển để tập trung vào các vấn đề thực sự mà họ cần phải giải quyết. – stsquad

1

Một lợi thế là dễ đọc. cdrom_init() ngay lập tức cho bạn biết rằng đó là lời gọi init() cho trình điều khiển cdrom.

5

là gì lợi thế của [module_init] trong Kernel 2,6

module_init cũng thoát trong 2.4, tâm trí bạn.

Nó thêm bản mẫu cần thiết để khởi tạo mô-đun và chạy hàm mục nhập khi tệp mô-đun được biên dịch vào hạt nhân chứ không phải là mô-đun.