// 定义要初始化的函数staticvoid__initinet_init(void){// inet_init的初始化内容}staticvoid__initipv4_offload_init(void){// ipv4_offload_init的初始化内容}// 使用 fs_initcall 宏将函数放置在 .initcall.init 节(section)中fs_initcall(inet_init); fs_initcall(ipv4_offload_init); 上述代码,inet_...
通过这个例子,我们明白了如何使用fs_initcall宏将这两个函数放置在.initcall.init节(section)中. 每个section空间排布情况是如何的? 还是上面inet_init和ipv4_offload_init函数来介绍,由于fs_initcall宏使用了__attribute__((__section__(".initcall.init"))),这将导致这些函数被放置在.initcall.init节(section)中。
以af_inet.c里面的fs_initcall(inet_init);fs_initcall(ipv4_offload_init);介绍放置的情况: 怎么在section放置的 在这个例子中,fs_initcall宏用于将inet_init和ipv4_offload_init函数放置在.initcall.init节(section)中。这样,在内核启动时,这些函数就会按照其在源文件中出现的顺序依次被调用。 下面是简化版本的代...
#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) #de...
Linux内核中的fs_initcall和subsys_initcall类似,也是初始化模块的入口。fs_initcall调用inet_init后开始网络协议栈注册。通过inet_init,将这些函数注册到了inet_protos和ptype_base数据结构中了。 如下图: 相关代码如下: //file: net/ipv4/af_inet.c
和我们平时写代码的方式不一样的是,内核是通过注册的方式来实现的。Linux内核中的fs_initcall和subsys_initcall类似,也是初始化模块的入口。fs_initcall调用inet_init后开始网络协议栈注册。通过inet_init,将这些函数注册到了inet_protos和ptype_base数据结构中了。如下图:...
大家都知道理解一个程序需要从其初始化看起,内核代码也是一样,不过内核是按模块初始化的,模块初始化这部分今天暂时先不讲,接下来会单独拎出来详细讲解。现在只需要知道TCP/IP协议栈的初始化是通过fs_initcall宏来完成的就行。 TCP/IP协议栈的初始化函数为 ...
static const char *initcall_level_names[] __initdata = { "pure", "core", "postcore", "arch", "subsys", "fs", "device", "late", }; static void __init do_initcalls(void) { int level; for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) ...
fs; device; late. 它们的所有名称是由数组initcall_level_names来描述的,该数组定义在源码文件init/main.c中: static char *initcall_level_names[] __initdata = { "early", "core", "postcore", "arch", "subsys", "fs", "device", "late", ...
207 #define fs_initcall_sync(fn) __define_initcall(fn, 5s) 208 #define rootfs_initcall(fn) __define_initcall(fn, rootfs) 209 #define device_initcall(fn) __define_initcall(fn, 6) 210 #define device_initcall_sync(fn) __define_initcall(fn, 6s) ...