内核启动之start_kernel()和rest_init()函数

start_kernel启动过程分析

start_kernel()函数在init/main.c文件里。

内核的初始化程序在start_kernel这个函数中,可以在线查看这些代码: start_kernel。通过阅读start_kernel代码,可以大致了解到内核在初始化的时候,做了以下工作:1. lockdep_init():初始化内核依赖关系表,初始化hash表

  1. boot_init_stack_canary():为栈增加保护机制,预防一些缓冲区溢出之类的攻击
  2. tick_init():初始化内核时钟系统
  3. boot_cpu_init():激活当前CPU
  4. setup_arch():对不同体系结构的CPU设置不同的参数、选项等
  5. trap_init():初始化硬件中断,函数中设置了很多中断门
  6. mm_init():建立内核的内存分配器
  7. sched_init():初始化任务调度
  8. init_irq():中断向量的初始化.... 很多初始化工作。
  9. rest_init():剩下的初始化工作,这里面其实做了很多工作.

 

Linux内核的启动在宏观上来看,就是start_kernel()来进行各种初始化工作,最终执行到rest_init()来初始化0号进程和1号用户态的进程。然后操作系统就运行起来了。

rest_init()最后执行cpu_startup_entry();cpu_startup_entry会调用cpu_idle_loop(), 在cpu_idle_loop()里面有个while(1)的循环一直执行,作为idle进程,pid是0号,此进程会一直执行下去,并且在系统没有任何需要执行的进程时,调度到此进程。

 

 

rest_init()函数分析

  (1)rest_init中调用kernel_thread函数启动了2个内核线程,分别是:kernel_init和kthreadd

  (2)调用schedule函数开启了内核的调度系统,从此linux系统开始转起来了。

  (3)rest_init最终调用cpu_idle函数结束了整个内核的启动。也就是说linux内核最终结束了一个函数cpu_idle。这个函数里面肯定是死循环。

  (4)简单来说,linux内核最终的状态是:有事干的时候去执行有意义的工作(执行各个进程任务),实在没活干的时候就去死循环(实际上死循环也可以看成是一个任务)。

  (5)之前已经启动了内核调度系统,调度系统会负责考评系统中所有的进程,这些进程里面只有有哪个需要被运行,调度系统就会终止cpu_idle死循环进程(空闲进程)转而去执行有意义的干活的进程。这样操作系统就转起来了。

 

 

2.2:进程0、进程1、进程2

 (1)操作系统是用一个数字来表示/记录一个进程/线程的,这个数字就被称为这个进程的进程号。这个号码是从0开始分配的。因此这里涉及到的三个进程分别是linux系统的进程0、进程1、进程2.

 (2)在linux命令行下,使用ps命令可以查看当前linux系统中运行的进程情况。

(4)我们在ubuntu下ps -aux可以看到当前系统运行的所有进程,可以看出进程号是从1开始的。为什么不从0开始,因为进程0不是一个用户进程,而属于内核进程。

  进程0:进程0其实就是刚才讲过的idle进程,叫空闲进程,也就是死循环。

  进程1:kernel_init函数就是进程1,这个进程被称为init进程。

  进程2:kthreadd函数就是进程2,这个进程是linux内核的守护进程。它的作用是管理调度其他内核进程这个进程是用来保证linux内核自己本身能正常工作的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值