linux内核启动过程分析(一)
从 源码目录/init/main.c开始分析
asmlinkage void __init start_kernel(void)
//__init表示这个函数的代码放在__init段中,这个段在arch/arm/kernel/vmlinux.lds.S链接文件中定义
1-> ......中间省略了很多其他的初始化设置
1-> rest_init();
2-> kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);//生成内核线程kernel_init
2-> pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);//生成内核线程kthreadd
kthreadd这个线程是一个死循环不会终止,这个线程用于内核线程的维护,创建新的内核线程
2-> cpu_idle();//又是一个死循环,在这个循环里不停地维护,然后调用schedule()调度用户进程
到这,linux内核就真正的跑起来了。下面分析内核生成的另一个线程:kernel_init
init进程分析:kernel_init
kernel_init
1-> .....此处省略一些函数调用
//这里完成的工作有:锁内核,设置当前线程屏蔽所有线程占领CPU,然后是多处理器的初始化
1-> do_basic_setup();//做基本的设置,这个函数比较有意思,分析下它:
2-> init_workqueues() 初始化 keventd_wq工作队列 其name域为events
2-> usermodehelper_init()创建一个工作队列khelper
2-> driver_init() 完成驱动程序的抽象设备,总线,设备类,固件,平台总线,系统总线等的注册
3-> devices_init();
3-> buses_init();
3-> classes_init();
3-> firmware_init();
3-> hypervisor_init();
3-> platform_bus_init();
3-> system_bus_init();
3-> cpu_dev_init();
&nbs