linux网络驱动初始化module_init函数跟踪

简介: module_init函数对做驱动开发的同学是在太熟悉了,但是关于底层的知识可能大家有些不愿去了解,而其中知识对于网络初始化也直接相关,所以先将此分享。 在驱动程序中有module_init函数,该函数定义在文件 include/linux/module.h中(以前好像在include/linux/init.h中),如下。

module_init函数对做驱动开发的同学是在太熟悉了,但是关于底层的知识可能大家有些不愿去了解,而其中知识对于网络初始化也直接相关,所以先将此分享。

在驱动程序中有module_init函数,该函数定义在文件

include/linux/module.h(以前好像在include/linux/init.h),如下。

#define module_init(x)  __initcall(x);

       该函数是驱动初始化函数入口,在内核启动或模块加载时候执行。每个模块一个module_init函数。

       不过module_init只是个宏,声明为__initcall,又声明在arch/um/include/shared/init.h文件中。

#define __initcall(fn) __define_initcall("1", fn)

#define __define_initcall(level,fn) \

        static initcall_t __initcall_##fn __used \

        __attribute__((__section__(".initcall" level ".init"))) = fn

__define_initcall(level,fn)这个宏的作用就是将初始化函数放在".initcall" level ".init"中。

       其中##表示连接的意思,__initcall_##fn##id 为__initcall_fn_id

如果fn = test_init,id = 6时,__initcall_##fn##id 为 __initcall_test_init6。(如果是#是字符串化的意思,#id 为“id”,id=6时,#id 为“6”。)

通过__attribute__(__section__)设置函数属性,也就是将test_init放在.initcall6.init段中。这个涉及连接的脚本。

       这些宏用于标记一些初始化函数或初始化数。内核在初始化阶段使用这些函数并在之后释放内存资源。

       平台设备的初始化(注册)用arch_initcall()调用,initcall的level为3;驱动的注册用module_init调用,即device_initcall,它的initcall 的level为6。

#define pure_initcall(fn)               __define_initcall(fn, 0)                                                    

 

#define core_initcall(fn)               __define_initcall(fn, 1)

#define core_initcall_sync(fn)          __define_initcall(fn, 1s)

#define postcore_initcall(fn)           __define_initcall(fn, 2)

#define postcore_initcall_sync(fn)      __define_initcall(fn, 2s)

#define arch_initcall(fn)               __define_initcall(fn, 3)

#define arch_initcall_sync(fn)          __define_initcall(fn, 3s)

#define subsys_initcall(fn)             __define_initcall(fn, 4)

#define subsys_initcall_sync(fn)        __define_initcall(fn, 4s)

#define fs_initcall(fn)                 __define_initcall(fn, 5)

#define fs_initcall_sync(fn)            __define_initcall(fn, 5s)

#define rootfs_initcall(fn)             __define_initcall(fn, rootfs)

#define device_initcall(fn)             __define_initcall(fn, 6)

#define device_initcall_sync(fn)        __define_initcall(fn, 6s)

#define late_initcall(fn)               __define_initcall(fn, 7)

#define late_initcall_sync(fn)          __define_initcall(fn, 7s)  

然后会调用do_initcalls函数调用通过xxx_initcall注册的各种函数,优先级高的先执行。所以通过module_init注册的函数在kernel启动的时候会被顺序执行。

目录
相关文章
|
9天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
38 11
|
1月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
78 2
|
2月前
|
机器学习/深度学习 数据采集 人工智能
未来的守护神:AI驱动的网络安全之盾,如何用智慧的光芒驱散网络黑暗势力?揭秘高科技防御系统背后的惊天秘密!
【10月更文挑战第3天】随着网络技术的发展,网络安全问题日益严峻,传统防御手段已显不足。本文探讨了构建AI驱动的自适应网络安全防御系统的必要性及其关键环节:数据采集、行为分析、威胁识别、响应决策和执行。通过Python库(如scapy、scikit-learn和TensorFlow)的应用实例,展示了如何利用AI技术提升网络安全防护水平。这种系统能够实时监控、智能分析并自动化响应,显著提高防护效率与准确性,为数字世界提供更强大的安全保障。
64 2
|
3月前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
80 4
|
7天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
57 13
|
8天前
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
31 11
|
2月前
|
运维 监控 网络协议
|
2月前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。
114 1
|
2月前
|
网络协议 安全 Ubuntu
Linux中网络连接问题
【10月更文挑战第3天】
40 1
|
3月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
159 6