日期:2014-05-16  浏览次数:20654 次

Linux内核网络协议栈1- socket文件系统注册

?

一、注册时机

1、在内核初始化时完成;
2、内核初始化过程(init/main.c):kernel_init()->do_basic_setup()->do_initcalls()->do_one_initcall()
3、socket文件系统注册过程(net/socket.c):core_initcall(sock_init)
1) core_initcall宏定义如下:
#define core_initcall(fn) __define_initcall("1",fn,1)

#define __define_initcall(level,fn,id) \
   static initcall_t __initcall_##fn##id __used \
   __attribute__((__section__(".initcall" level ".init"))) = fn
宏定义__define_initcall(level,fn, id)对于内核的初始化很重要,他指示编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化阶段,do_initcalls()将按顺序从该section中以函数指针的形式取出这些函数的起始地址,来依次完成相应的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成,因此这个顺序排列常常很重要。该宏的作用分三部分:a) 申明一个函数指针initcall_t