zoukankan      html  css  js  c++  java
  • 《linux内核分析》第三次课 实验作业

    潘聪 原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

    ---------------------------------------------------------------

    实验要求:

    • 使用gdb跟踪调试内核从start_kernel到init进程启动

    • 详细分析从start_kernel到init进程启动的过程并结合实验截图撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:

      • 题目自拟,内容围绕Linux内核的启动过程,即从start_kernel到init进程启动;

      • 博客中需要使用实验截图

      • 博客内容中需要仔细分析start_kernel函数的执行过程

      • 总结部分需要阐明自己对“Linux系统启动过程”的理解,尤其是idle进程、1号进程是怎么来的。

    • 3)请提交博客文章URL到网易云课堂MOOC平台Linux内核分析MOOC课程,编辑成一个链接可以直接点击打开。

    -----------------------------------------------------------------

     配置环境要点如下:

    1. i386_defconfig中有一个下划线(因为没看到纠结了好久。。)

    2. -lpconfig中老师给的命令的连字符不对(又纠结了好久。。)

    3. dbg看代码是否清晰?答案是否。又不想花大量的时间配置vim/emacs,于是用wine装了神器sourceinsight用来阅读代码

    sudo apt-get install wine #中间ttf的一个协议说明对话框用tab选择到ok

    自行下载sourceinsight

    自行配置sourceinsight(最主要的是放大字体!另外记得熟悉各类跳转的快捷键)

    新建一个新的项目,包含linux下的所有文件夹,需要一段时间收集symbols,否则就没办法自由的跳转定义和引用了(这才是用sourceinsight的理由不是么)

    ------------------------------------------------------------------

    MenuOS启动截图如下:

    --------------------------------------------------------------------------------------

    kernel_start启动过程(重要部分):

    首先,我们需要知道关于进程(linux中严格意义上没有线程)在linux内核中是如何表示的。

    进程可以分为用户进程和内核进程,区别在于内核进程有更大的权限,当用户程序需要执行高权限的命令时,存在一个用户进程和内核进程之间的传递,从而内核进程执行关键命令后将结果返回到用户进程。

    在源代码中,用户进程用task_struct表示,包含进程的基本信息,如进程号,进程状态,函数入口,堆栈等信息。而对应的内核进程用init_task表示,结构基本与task_struct一致,即init进程。这个进程是0号进程,也是第一个出现的内核进程。

    与此相对的是init进程,其为1号进程,也是第一个出现的用户进程,是其他所有用户进程的父进程。其他所有的用户进程通过init进程执行do_fork()函数而得到。

    在start_kernel函数中,进行了大量的内核初始化过程,包括内存、cpu、错误检测等;我们重点分析的是其启动init进程的过程。源代码因为大家都有,就不贴上来了。在此说明的是,init_task进程不在start_kernel函数中创建,而在更早的初始化过程中创建,而init进程在子函数rest_init中创建。rest_init函数在启动完init进程后并没有退出,而是继续往下执行道了cpu_startup_entry函数,从而使进程实际上进入了无限循环,也就是原执行流在fork出init进程后,把自己变成了idle进程。

  • 相关阅读:
    C#:正则表达式
    jsp:
    关于博客的设置
    登录注册案例—MongoDB数据库连接
    cookie封装
    博客样式
    自己的博客
    CentOS7 启动docker.service失败
    合并多个jar包,并通过私服依赖
    springboot+支付宝条码支付开发详解
  • 原文地址:https://www.cnblogs.com/codingpenguin/p/4346208.html
Copyright © 2011-2022 走看看