linux start_kernel相关进程的思考


退休的贵族进程 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号进程是怎么来的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。