《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进程。

原文地址:https://www.cnblogs.com/codingpenguin/p/4346208.html