跟踪分析Linux内核的启动过程

攥写人:杨光  学号:20135233

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )

知识总结:

****Linux内核中关键目录:

  arch:不同cpu的支持,我们主要关注的是其中x86文件夹

  init:内核启动的相关代码,期中main.c是内核启动的起点,main.c中的start_kernel是内核初始化的起点

  kernel:Linux内核的核心代码所在

    ipc:进程通信相关

fs:文件系统

  mm:内存管理

  net:网络相关

****0号进程:rest_init

  它再创建kernel_init,创建1号进程init

****1号进程、第一个用户态进程:init

****trap_init:中断初始化

****sched_init:进程调度初始化

实验部分:

*************使用自己电脑配置环境过程*************

首先,使用wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz命令下载内核文件

下载完成后,使用 xz -d linux-3.18.6.tar.xz  tar -xvf linux-3.18.6.tar命令进行解压

解压完进入linux-3.18.6文件夹make i386_deconfig

然后make安装

此处由于被墙,我是使用的从网易云课堂下载的menu包,自己复制到虚拟机上

由此,虚拟机的环境便搭建完成了,之后跟实验楼过程基本一致

***********实验楼过程***********

cd LinuxKernel 进入目录  

使用qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img命令启动内核

使用qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S指令

 -S cpu初始化之前,冻结启动,之后gdb的过程中输入“c”进入下一步
-s 在端口上创建tcp接口

  

另开一个shell窗口,使用gdb命令进行调试

(注意!必须先进入 LinuxKernel文件夹,不然之后file会找不到文件,下图就是进入的示范)

现在再gbd就没问题啦,加载符号表,设置端口,断点

设置了断点之后,输入“c”进行下一步,此时内核会运行到断点位置停止

回到shell,使用list命令列出此时的代码段

设置新的断点rest_init,然后使用“c”命令继续

此时内核运行的状态

使用list命令列出此时的代码段

根据实验中追踪到的行数,在代码中找到对应位置,进行分析    代码链接http://codelab.shiyanlou.com/xref/linux-3.18.6/

***********************************************************************

总结分析:

*内核启动的代码在 init文件夹main.c文件中 的 start_kernel

*创建pcb

*下图分别为trap(中断)mm(内存管理) sched(进程调度) 模块的初始化

*start_kernel函数的最后一句是rest_init();

这个进程在内核启动时就一直存在,是0号进程,0号进程是最终的idle进程(rest_init)

*这个0号进程创建了1号进程和其他的服务线程

1号进程(第一个用户态进程):

服务线程:

*kernel_init中,下图红线所划就是第一个用户态进程的创建(1号进程)

*在0号进程创建1号进程后,一个进程创建另一个进程和线程,一生二、二生三、三生万物,系统内核就启动了

跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点的更多相关文章

  1. 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结

    实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...

  2. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

  3. 实验三:跟踪分析Linux内核的启动过程

    实验三:跟踪分析Linux内核的启动过程 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.16 ...

  4. 跟踪分析Linux内核的启动过程小解

    跟踪分析Linux内核的启动过程 “20135224陈实  + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

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

    回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录 ...

  6. 跟踪调试Linux内核的启动过程

    跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  7. Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  8. Linux内核分析实验三----跟踪分析Linux内核的启动过程

    一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_ker ...

  9. Linux内核分析之跟踪分析Linux内核的启动过程

    一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...

随机推荐

  1. window下上传文件至linux(windows下如何访问linux)

    ========相信我,按照步骤来一定能成功====== 我将从三个方面来说明:为什么要搭建访问服务器.如何搭建访问服务器.windows如下访问 为什么要搭建访问Linux服务器 我们都知道,服务器 ...

  2. spring IOC中三种依赖注入方式

    Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...

  3. 用Promise解决多个异步Ajax请求导致的代码嵌套问题【转】

    问题 前端小同学在做页面的时候,犯了个常见的错误:把多个Ajax请求顺序着写下来了,而后面的请求,对前面请求的返回结果,是有依赖的.如下面的代码所示: var someData; $.ajax({ u ...

  4. codeforces 1045 D. Interstellar battle

    题目大意:一颗树,给定每个点消失的概率,求出连通块的期望值.要求支持修改消失概率的操作并且给出每次修改过后的期望值.注意被破坏的点不能算入连通块中. 数据范围,时限1S. 传送门 D. Interst ...

  5. python之面向对象进阶2

    封装.property装饰器 封装分为3种情况:封装对象的属性.封装类的属性.封装方法. 封装对象的属性:(在属性名前加双下划线__) class Person: def __init__(self, ...

  6. Reflection 反射

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/A__17/article/details/30571923 1.概念:所谓的反射.能够理解为在运行时 ...

  7. DStream算子讲解(一)

    先把目录列好,方便有条理的进行整理

  8. Python--Windows下安装虚拟环境

    为什么需要虚拟环境 在python开发中,我们可能会遇到一种情况:就是当前的项目依赖的是某一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲突.在这种情况之下,我们就需要一个工具能够将这两 ...

  9. go标准库的学习-crypto/aes

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/aes" aes包实现了AES加密算法,参见U.S. Federal ...

  10. 深入理解Java中的final关键字(转)

    文章转自http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量, ...