当前位置: 技术问答>linux和unix
求教!c语言代码,linux内核的
来源: 互联网 发布时间:2017-03-31
本文导语: 这段代码 #define __define_initcall(level,fn,id) static initcall_t __initcall_##fn##id __used __attribute__((__section__(".initcall" level ".init"))) = fn 我是再找module_init();的实现,一路向上到这看懵了,大婶讲解下谢谢! #define m...
这段代码
#define __define_initcall(level,fn,id)
static initcall_t __initcall_##fn##id __used
__attribute__((__section__(".initcall" level ".init"))) = fn
我是再找module_init();的实现,一路向上到这看懵了,大婶讲解下谢谢!
#define module_init(x) __initcall(x);
#define __initcall(fn) device_initcall(fn)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define __define_initcall(level,fn,id)
static initcall_t __initcall_##fn##id __used
__attribute__((__section__(".initcall" level ".init"))) = fn
我是再找module_init();的实现,一路向上到这看懵了,大婶讲解下谢谢!
#define module_init(x) __initcall(x);
#define __initcall(fn) device_initcall(fn)
#define device_initcall(fn) __define_initcall("6",fn,6)
|
回复请引用,不然神奇的csdn看不到通知.
主体是:
int pf=fn;
__attribute__这个是修饰这个变量的作用.__attribute__括号里面的东西太多了,我也就略知皮毛.
__section__ 只是其中一种.官方的请看上面的参考2网址.
个人理解,反正就是告诉编译器这个变量在编译之后会在什么位置之类的,如果没有的话我们完全不知道编译器会把它怎么实现.(定义到乱七八糟的位置/优化掉没了/其他我们不愿意发生的情况 = =)
__attribute__可以修饰函数和变量,修饰变量时可以是aligned (alignment)对齐.等等功能.反正我用过最多就是内存对齐,嘿嘿.
主体是:
int pf=fn;
__attribute__这个是修饰这个变量的作用.__attribute__括号里面的东西太多了,我也就略知皮毛.
__section__ 只是其中一种.官方的请看上面的参考2网址.
个人理解,反正就是告诉编译器这个变量在编译之后会在什么位置之类的,如果没有的话我们完全不知道编译器会把它怎么实现.(定义到乱七八糟的位置/优化掉没了/其他我们不愿意发生的情况 = =)
__attribute__可以修饰函数和变量,修饰变量时可以是aligned (alignment)对齐.等等功能.反正我用过最多就是内存对齐,嘿嘿.
|
1.
__define_initcall("6",fn,6)
2.
static initcall_t __initcall_fn6 __used
__attribute__((__section__(".initcall" "6" ".init")))=fn
3.
static initcall_t __initcall_fn6 __used
__attribute__((__section__(".initcall6.init")))=fn
没看过内核的代码,大致推理到这一步.猜测就相当于
static int pf=fn;
这样的中心意思吧,不过就是类型复杂点,赋值可能是函数指针,手动控制地址;
在".initcall6.init"段定义了一个initcall_t类型的静态变量,变量名为__initcall_fn6,且是被使用的.并赋予一个值:fn.
理解有误的话请楼下大侠轻拍.
参考:
1. ## :
1. __section__ :
|
这个我也不好说,据我所知是gcc编译器的扩展,不是标准c语言的一部分.
看gnu的手册才是比较权威的解释.所以,看手册吧.
看gnu的手册才是比较权威的解释.所以,看手册吧.