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线程。
阅读(1843) | 评论(1) | 转发(0) |