内核源码解读基础

来源:互联网 发布:手机上能开淘宝店吗 编辑:程序博客网 时间:2024/06/06 18:46

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) printf(#var"= %d\n",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是否置位
未完待续


0 0
原创粉丝点击