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启动的时候会被顺序执行。

目录
相关文章
|
3天前
|
域名解析 网络协议 Linux
linux网络配置详解
linux网络配置详解
12 0
|
3天前
|
机器学习/深度学习 人工智能 安全
构建未来:AI驱动的自适应网络安全防御系统
【5月更文挑战第8天】 随着网络攻击的不断演变,传统的安全措施已不足以应对日益复杂的威胁。本文提出了一种基于人工智能(AI)的自适应网络安全防御系统,旨在通过实时分析网络流量和行为模式来自动调整安全策略。系统利用深度学习算法识别潜在威胁,并通过强化学习优化防御机制。初步实验表明,该系统能够有效提高检测率,减少误报,并在未知攻击面前展现出较强的适应性。
15 1
|
4天前
|
网络协议 Java Linux
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
10 0
|
4天前
|
存储 网络协议 算法
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
11 0
|
4天前
|
网络协议 算法 Linux
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
14 0
|
4天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
11 0
|
4天前
|
存储 网络协议 Unix
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
6 0
|
4天前
|
网络协议 Linux 数据安全/隐私保护
【探索Linux】P.24(网络基础)
【探索Linux】P.24(网络基础)
13 0
|
4天前
|
消息中间件 Unix Linux
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
10 0
|
4天前
|
Linux Shell
Linux中system函数
Linux中system函数
7 0