您的位置:首页 > 运维架构 > Linux

linux kernel 启动流程简单分析

2015-03-22 17:47 197 查看
Ping + http://mooc.study.163.com/course/USTC-1000029000 
 

Linux 内核启动的时候,总是从start_kernel()这个函数作为入口。start_kernel完成了对各种资源的初始化。随后,调用了rest_init(),完成对init进程的启动。

我们用gdb跟踪linux kernel 内核启动可以看到。

1. 我们把断点置于start_kernel()的入口,当程序运行停止在该函数处时, 根据其堆栈情况,我们可以看到i386_start_kernel()调用了start_kernel().

 


2. 随后我们将断点置于rest_init()的开始。当程序运行到该断点的时候。我们跟踪进入该函数。可以看到这个函数实现了对init process的启动。

                       kernel_thread(kernel_init, NULL, CLONE_FS);

kernel_thread() 调用do_fork() fork出一个新的进程。kernel_init()中完成了对init process的调用。kernel_init()中会依次启动sbin/init, etc/init,bin/init, bin/sh这些进程。kernel_init的进程编号的是#1.

3. 在rest_init()中还会启动#2 进程。kthreadd



4. 在rest_init()的最后还会启动一个idle task.这个task就是一个while(1)的死循环。它可以由cpu的中断来打破这个循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux kernel