Linux内核模块中module_init和init_module有什么区别?

Linux内核模块中module_init和init_module有什么区别?,第1张

概述Linux内核模块中module_init和init_module有什么区别?

我一直在尝试移植几个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的内核2.6中需要改变?

linux内核中的硬件中断堆栈上半部分?

如何获取监听套接字的BACKLOG

如何在内核和用户空间之间创build一个“netlink”?

目前的linux内核deBUGging技术

linux页面表pipe理和MMU

是否需要在softirq上下文中调用rcu_read_lock

linux系统调用和INT 80软件中断之间的巨大差异

内核模块将不会链接 – 找不到符号mutex_lock_nested

使用net_device可能取消私人数据的引用

linux内核中的Dentry和超级块结构之间的循环依赖关系

如果你看看新功能的定义:

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

你会看到它确保包含正确的样板,所以这些特殊的功能可以被编译器正确处理。 这就是linux的内部API所做的事情,如果有更好的解决方法,它就会发展。

内核2.6中的[module_init]的优点是什么?

2.4中的module_init也退出了,介意你。

当模块文件被编译到内核而不是模块时,它添加了必要的样板文件来初始化模块并运行入口函数。

一个优点是可读性。 cdrom_init()立即告诉你这是cdrom驱动程序的init()调用。

总结

以上是内存溢出为你收集整理的Linux内核模块中module_init和init_module有什么区别?全部内容,希望文章能够帮你解决Linux内核模块中module_init和init_module有什么区别?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1294383.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存