刘柳 + 《Linux内核分析》MOOC课程
退休的贵族进程 0号进程
-
所有进程的祖先叫做进程0
-
在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程
-
进程0最后的初始化工作创建init内核线程,此后运行cpu_idle,成为idle进程
控制权的接力棒从bios-->bootloader-->idle,某种程度上说,就是完成子系统初始化使命后,就退居二线了。
0号进程一直处于皇宫“内核态”,没有出过宫“到用户态”,所谓贵族终身。
0号进程的代码概要图
进入loop的堆栈样本如下:
-
(gdb) bt
-
#0 cpu_idle_loop () at kernel/sched/idle.c:201
-
#1 cpu_startup_entry (state=<optimized out>) at kernel/sched/idle.c:274
-
#2 0xc175d22d in rest_init () at init/main.c:418
-
#3 0xc1a4bb59 in start_kernel () at init/main.c:680
-
#4 0xc1a4b360 in i386_start_kernel () at arch/x86/kernel/head32.c:49
-
#5 0x00000000 in ?? ()
来个截图吧,贴吧中少有的动态库,展示的是进入Loop后的堆栈 ,还有loop中的代码运行
用户1号进程的前世今生
-
进程1又称为init进程,是所有用户进程的祖先
-
由进程0在start_kernel调用rest_init创建
-
init进程PID为1,当调度程序选择到init进程时,init进程开始执行kernel_init ()函数
-
init是个普通的用户态进程,它是Unix系统内核初始化与用户态初始化的接合点,它是所有用户进程的祖宗。在运行init以前是内核态初始化,该过程(内核初始化)的最后一个动作就是运行/sbin/init可执行文件
概念验证:
关键代码位置:
用户态进程:看堆栈。(核心态进入内核,check)
附录:
题目自拟,内容围绕Linux内核的启动过程,即从start_kernel到init进程启动;
博客中需要使用实验截图
博客内容中需要仔细分析start_kernel函数的执行过程
总结部分需要阐明自己对“Linux系统启动过程”的理解,尤其是idle进程、1号进程是怎么来的。
所有进程的祖先叫做进程0
在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程
进程0最后的初始化工作创建init内核线程,此后运行cpu_idle,成为idle进程
概念验证:
主要流程图
(start)--->rest_init--->(被调度)--一个loop中
进程1又称为init进程,是所有用户进程的祖先
由进程0在start_kernel调用rest_init创建
init进程PID为1,当调度程序选择到init进程时,init进程开始执行kernel_init ()函数
init是个普通的用户态进程,它是Unix系统内核初始化与用户态初始化的接合点,它是所有用户进程的祖宗。在运行init以前是内核态初始化,该过程(内核初始化)的最后一个动作就是运行/sbin/init可执行文件
概念验证:
关键代码位置:
用户态进程:看堆栈。(核心态进入内核,check)
附录:
题目自拟,内容围绕Linux内核的启动过程,即从start_kernel到init进程启动;
博客中需要使用实验截图
博客内容中需要仔细分析start_kernel函数的执行过程
总结部分需要阐明自己对“Linux系统启动过程”的理解,尤其是idle进程、1号进程是怎么来的。
阅读(1880) | 评论(0) | 转发(0) |