内核开发在很大程度上并不是重新造“轮子"的过程,而是深入理解并尽量复用现有的内核设计框架,然后参照相似的功能模块去添加或改写某项需要的功能。在对内核整体框架以及某些子系统融会贯通以后,我们才有可能站在巨人的肩膀上去改进框架本身,实现自主创新。如果过分强调不必要的“自主创新”,可能会让内核的可维护性变差,最终结果反而得不偿失。
1.设备驱动入口
模块的入口函数一般会使用
module_init(modname_init)进行声明。
#define module_init(x) __initcall(x); //include/linux/init.h
2.子系统入口
内核选项的解析完成之后,各个子系统的初始化即进入第二部分一入口函数的调用。通常USB、PCI这样的子系统都会有一个名为subsys_initcall的入口,如果你选择它们作为研究内核的切入点,那么就请首先找到它。
3.内核入口
初始入口(第一入口)是体系结构相关的,在汇编语言代码里面;
而通用入口(第二入口)是体系结构无关的,在C语言里面实际上就是init/main.c里面的start_kernel()这个do_initcalls()就是我们需要寻找的函数了,在这个函数中执行所有使用module_init()声明的函数
start_kernel -> rest_init();-> kernel_thread(kernel_init, NULL, CLONE_FS);-> kernel_init()-> kernel_init_freeable();-> do_basic_setup();-> do_initcalls();