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 内核启动的时候,总是从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的中断来打破这个循环。
相关文章推荐
- Atmel SAMA5D3 U-Boot 启动流程简单分析
- android开机启动流程简单分析
- Android启动流程的简单分析
- android开机启动流程简单分析
- uboot 启动流程分析
- 14.3 U-Boot启动流程分析
- u-boot移植(一)---u-boot启动流程分析
- shark接口1分析(一)--启动流程
- 简洁 DIV+CSS布局入门之一 ( DIV+CSS常用 常用CSS DIV+CSS实例 简单DIV+CSS DIV+CSS布局分析 DIV+CSS流程)
- [转载] linux启动流程分析(4)---汇编部分(3)
- linux启动流程分析-内核解压缩过程
- linux 2.6 启动流程分析
- [转载] linux启动流程分析(4)---汇编部分(5)
- [转载] linux启动流程分析(3)---内核解压缩过程
- [转载] linux启动流程分析(4)---汇编部分(1)
- bootloader的启动流程分析
- 简洁 DIV+CSS布局入门之四 ( DIV+CSS常用 常用CSS DIV+CSS实例 简单DIV+CSS DIV+CSS布局分析 DIV+CSS流程)
- shark接口1分析(一)--启动流程
- 基于x86的Redboot启动流程分析
- [转载] linux启动流程分析(1)---bootloader启动内核过程