linux kernel 启动流程简单分析

来源:互联网 发布:调节手机光线软件 编辑:程序博客网 时间:2024/05/30 05:25

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().

 Linux 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

Linux kernel启动流程分析

4. 在rest_init()的最后还会启动一个idle task.这个task就是一个while(1)的死循环。它可以由cpu的中断来打破这个循环。

0 0
原创粉丝点击