module_init宏的定义
第一段代码:
typedef int (*initcall_t)(void);
......
#define __define_initcall(level,fn,id)\
static initcall_t __initcall_##fn##id __attribute_used_ \
__attribute__((__section__(".initcall" level ".init"))) = fn
......
#define device_initcall(fn) __define_initcall("6",fn,6)
......
#define __initcall(fn) device_inicall(fn)
......
#define module_init(x) __initcall(x)
第二段代码:
#define INITCALLS
*(.initcall0.init) \
*(.initcall0s.init) \
......
*(.initcall7.init) \
*(.initcall7s.init)
第三段代码:
.initcall.init :AT(ADDR(.imitcall.init) - LOAD_OFFSET){//这段代码依然不理解
__initcall_start = .;
INITCALLS
__initcall_end = .;
}
第四段代码:
static void __init do_initcalls(void)
{
initcall_t *call;
int count = preempt_count();
for (call = __initcall_start;call < __initcall_end;call++){
......
result = (*call)();
......
}
flush_sheduled_work();
}
第五段代码:
typedef int (*initcall_t)(void);
......
#define module_init(initfn) \
static inline initcall_t __inittest(void) \
{return initfn;}
int init_module(void) __attribute__((alias(#initfn)));
天书一样的代码,但毕竟还是可以理解的,只不过需要一些内核知识和良好的c语言基础。
c语言代码中的"#"与"##"的用法:
(1)"#"的使用
eg:
#define PrintfStr(arg) printf("%s",#arg)
PrintfStr(output) ->prinf("%s","output")
eg:
#define show(var)
show(number) -> printf("number = %d\n",var);
(2) "##"的使用
eg:
#define join(a,b) a##b
strlen_s(join(var,123),sizeof(join(var,123)))->strlen_s(var123,sizeof(var123))
gcc中的attrbute()
__attribute__可以设置函数属性,变量属性,类型属性
__attribute__的section子项使用方式:
__attribute__((section("section_name")))将作用的函数或数据放入指定名为"section_name"的段
通过__attribute__((alias(#initfn)))为函数定义一个别名
当从内核态返回到用户态的时候,要检查是否进行调度,而调度要看两个条件:
1.preempt_count是否为0
2.rescheduled是否置位
未完待续