linux kernel 启动流程简单分析

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值