内核总结之系统初始化

1,内核的初始化
内核的初始化包括三部分,初始化硬件设备;初始化各内核子系统,建立必要的数据结构;建立init进程,转入用户空间的处理
1.1,内核转入内存后,首先跳入到物理地址1MB处,也就是内核的入口函数startup_32,首先初始化内存管理,中断向量;建立swapper进程的stack;内核跳入startup_32时已处于BIOS设置的保护模式,内核在此还要重新设置自己的保护模式。至此第一阶段的初始化已经完成,主cpu进入第二阶段,次cpu跳入idle进程
1.2 第二阶段进行较高层次的初始化,由start_kernel()完成
对内核的子系统进行初始化,比如,
534     trap_init();
535     init_IRQ();
536     sched_init();
537     time_init();
538     softirq_init();
其中time_init,注册中断处理函数timer_interrupt.
shed_init()对调度部分进行初始化,并初始化timer_bh这些bh机制,为什么放在这里?
1255     for(nr = 0; nr < PIDHASH_SZ; nr++)
1256         pidhash[nr] = NULL;
1257        
1258     init_timervecs();
1259
1260     init_bh(TIMER_BH, timer_bh);            
1261     init_bh(TQUEUE_BH, tqueue_bh);
1262     init_bh(IMMEDIATE_BH, immediate_bh);
现在内存和进程管理已经初始化完,进入init内核线程做一些real work
do_basic_setup()
677     /*
678      * Ok, at this point all CPU's should be initialized, so
679      * we can start looking into devices..
680      */
681 #ifdef CONFIG_PCI
682     pci_init();
683 #endif

712     /* Networking initialization needs a process context */
713     sock_init();

722     start_context_thread();          //启动keventd内核线程
723     do_initcalls();
724
725     /* .. filesystems .. */
726     filesystem_setup();
727
其中do_initcalls完成各子系统的初始化
启动用户空间的init进程,初始化结束
789     execve("/sbin/init",argv_init,envp_init);
其中swapper线程进入cpu_idle(),成为idle线程。

作者: sandflee   发布时间: 2010-09-25