linux kernel启动跟踪

说明,本文为我学习孟宁老师的linux内核课的一点总结,同时作为上课的作业。

作者:唐建,《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、准备工作:将编译linux内核,并将调试信息也编译进去。

使用在linux 根目录执行make menuconfig命令进入配置界面;向下找到kernel hacking 选项并进入;

然后找到“compile-time checks and compiler options”选项并进入;然后向下找到“compile the kernel with debug info”通过空格键选择,然后保存退出。然后make 编译

二、启动调试信息

我们这里创建了一个简单的文件系统rootfs,过程就不细讲。

进入代码根目录,通过qemu 来模式具体的机器:qemu -kernel arch/x86/boot/bzImage -initrd ./rootfs.img -s -S

    -s 为后面gdb 调试做准备

    -S 然后系统启动后挂起,便于我们调试。

如下图,启动后就停止了

启动gdb开始跟踪:需要另起一个shell 窗口。

先file vmlinux 加载系统的符号表,然后让gdb 和启动的linux 建立连接target remote:1234。

三、开始跟踪linux 内核的启动过程

1、linux 内核都是从start_kernel 函数开始启动的,于是我们先将断点打在start_kernel这里。

可以看到当我们c执行后,就断到start_kernel这里了。下面我们结合代码来分析。

如上图,init_task 是第一个内核进程 pid=0(就是后续的IDLE进程,后面我们再详述)的结构体的初始化,0号进程就是start_kernel,这里是将

这个进程的信息写入进程结构体中。start_kernel这个函数是linux内核的起点,他主要完成系统启动前的初始化工作,这里只标注我认识的(不好意思)

2、init进程启动

这里我们着重看star_kernel函数最后的调用rest_init(),我们可以认为这时候初始化完成了。断点断住它

这个rest_init 这个函数代码如下,他主要通过kernel_thread(调用do_fork)创建了两个进程init、kthread。

init——进程入口kernel_init()。大家看下kernel_init这个函数的启动流程,其实他就是,挨个找各个目录中的init程序来采用shell的形式进行启动,直到找到为止,

所以这里实际上就启动了系统第二个进程,我们通常看到的init进程。

这里代码没有获取pid,所以我们没法打印出来,但是可以知道这个pid应该是1,因为pid是递增的。——有人会问,这里实际上是两个

再看下下面这个是我的linux系统的文件结构和进程列表,大家应该看到了吧我sbin下面有init,所以我的1号进程为/sbin/init.

3、kthread进程启动。

如下图,紧接着创建了kthreadd进程。kthreadd这个进程函数里面是一个死循环。这是第三个进程,所以可以推测pid为2

如下图,当创建完进程到下一步时,我们看到pid为2

4、idle 进程

好了,现在创建好了1、2号进程,我们再说回0号进程。我们前面说了start_kernel就是0号,我们继续往下看他是怎么变回0号进程的。

如上图,最终调用到cpu_idle_loop后是一个死循环。

总结:linux系统的起点是start_kernel,同时他也是第一个进程idle的入口函数。然后这个进程创建了init = 1进程和kthreadd = 2两个进程。

       重点是idle进程,这个进程不是通过do_fork出来的,他是制造出来的。后续其他进程都是有1进程fork出来的

原文地址:https://www.cnblogs.com/tjyuanxi/p/9097944.html

时间: 2024-10-07 09:44:26

linux kernel启动跟踪的相关文章

linux内核可以接受的参数 | Linux kernel启动参数 | 通过grub给内核传递参数

在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB或LILO等启动程序调用之时传递给kernel. 3.在kernel运行时,修改/proc或/sys目录下的文件. 这里我简单讲的就是第二种方式了,kernel在grub中配置的启动参数. 首先,kernel有哪些参数呢? 在linux的源代码中,有这样的一个文档Documentation/kern

Linux kernel启动选项(参数)

在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB或LILO等启动程序调用之时传递给kernel. 3.在kernel运行时,修改/proc或/sys目录下的文件. 这里我简单讲的就是第二种方式了,kernel在grub中配置的启动参数. 首先,kernel有哪些参数呢? 在linux的源代码中,有这样的一个文档: https://www.kern

【转】Android kernel启动流程

;font-family:Arial, Console, Verdana, 'Courier New';line-height:normal;white-space:normal;background-color:#FFFFFF;"> linuxandroidmakefileimagecachealignment 虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makef

Linux kernel的中断子系统之(二):IRQ Domain介绍

一.概述 在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断: 1.IRQ number.CPU需要为每一个外设中断编号,我们称之IRQ Number.这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断. 2.HW interrupt ID.对于interrupt controller而言,它收集了多个外设的interrupt request line并向上传递,因此,interrupt controller需要对

20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录:内核启动相关的代码基本都在该目录中(比如main.c等) start_kernel函数就相当于普通C程序的main函数 kernel/目录:Linux内核核心代码在kernel目录中 README 介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等 构造一个简单的linux系统m

I.MX6 Linux Qt 启动流程跟踪

/************************************************************************** * I.MX6 Linux Qt 启动流程跟踪 * 声明: * 1. 源代码来源MY-I.MX6: * 2. 本文仅仅是对启动流程的解析,没有解释启动流程为什么是这样的问题. * * 2015-6-13 深圳 晴 南山平山村 曾剑锋 *********************************************************

CentOS启动流程、Grub legacy配置、linux kernel模块管理、伪文件系统介绍

写在前面: 博客书写牢记5W1H法则:What,Why,When,Where,Who,How. 本篇主要内容: ● 启动相关基础概念汇总 ● 启动流程 ● init程序类型     /etc/rc.d/rc     chkconfig     /etc/rc.d/rc.sysinit ● GRUB legacy     命令行接口     配置文件 ● Linux Kernel     内核模块查看与管理         lsmod         modinfo         modprob

Linux Kernel系列一:开篇和Kernel启动概要

前言 近期几个月将Linux Kernel的大概研究了一下,以下须要进行深入具体的分析.主要将以S3C2440的一块开发板为硬件实体.大概包含例如以下内容: 1 bootloader分析,以uboot为主,结合详细开发板的情况.我的目标是解释清楚uboot的工作原理(说实话,分析过程中不太想被硬件绑架,可是须要以一个实际的样例 来做分析) 2 kernel部分,这就非常多内容了.打算从kernel启动的流程開始分析. 3 除kernel本身外,还有非常多的知识,比如ld的输入script分析等,

Linux Kernel - Debug Guide (Linux内核调试指南 )

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环