《Linux内核原理与分析》第四周学习总结:

1.课本知识总结:

本章内容并不多,首先是介绍了一些Linux内核源代码的目录结构,并基于Linux内核源代码构造一个简单的操作系统MenuOS,同时在MenuOS启动过程中跟踪分析Linux内核的启动过程。
操作系统的“两把宝剑”:中断上下文、进程上下文。其中中断上下文的切换主要用来保存现场和恢复现场,而进程上下文实际上是进程执行活动全过程的静态描述。
书中所描述的一切内容都是基于Linux内核3.18.6版本,其中Linux内核源码的目录包括以下这些:

其中我们主要关注arch目录,因为它里面存放了许多CPU体系结构的相关代码;
当然也有几个比较关键的目录:
block: 存放Linux存储体系中关于块设备管理的代码;
crypto:存放常见的加密算法的C语言代码;
init(初始化):存放Linux内核启动时的初始化代码;
ipc目录:存放Linux支持的IPC(进程间通信)的代码实现;
kernel:存放内核本身需要的一些核心代码文件;等等。

2.构造一个简单的Linux内核:

由于实验是在实验楼上进行的,已经搭好了环境,所以不再过多进行描述。
这里主要讲如何在自己的虚拟机搭环境,构建一个简单的Linux内核:
首先是进行Linux3.18.6内核版本的下载,下载好后编译并运行,虽然等待时间很长,但自己动手做一遍觉得会有不同的收获。


运行后我们可以进行根文件系统的制作,这样就可以启动不带调试信息的Linux内核和MenuOS了:

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

虽然实验对照书上内容看操作并不难,但理解起来确实蛮难的。
第一步:使用gdb跟踪调试内核,首先命令中有-s与-S参数的加入:
-S:freeze CPU at startup (use ’c’ to start execution) 在系统启动的时候冻结CPU,使用c键继续执行后续操作;
-s:shorthand for -gdb tcp::1234 打开远程调试端口,默认使用tcp协议1234端口,若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项 。
这个指令的作用是在开始的时候就让CPU停止在启动的那一刻,我们可以看到如下的界面:

第二步:再打开一个窗口,水平分割,启动gdb,把内核加载进来,建立连接,并设置相应断点加用‘c’运行:

第三步:对内核启动的有关分析:
(1)start_kernel()
main.c 中没有 main 函数,start_kernel() 相当于是C中的main函数。start_kernel是一切的起点,在此函数被调用之前内核代码是用汇编语言写的,完成系统的初始化工作,为c代码的运行设置环境。由调试可得 start_kernel 在500行:

(2)init_task()
start_kernel() 函数几乎涉及到了内核的所有模块,如:trap_init()(中断向量的初始化)、mm_init()(内存管理的初始化)sched_init()(调度模块的初始化)等,首先是510行的init_task():

可以看出 init_task(0号进程)是 task_struct 类型,是进程描述符,使用宏INIT_TASK对其进行初始化。接下来就是对各种模块的初始化。
(3)rest_init()
通过rest_init()新建kernel_init、kthreadd内核线程:

在403行代码中调用 kernel_thread()创建1号内核线程(在 kernel_init 函数正式启动)。
这里对比一下init_task 和 kernel_thread():

kernel_thread()是 fork 出了一个新进程来执行kernel_init 函数,而 init_task 是使用宏进行初始化的。也就是说0进程不是系统通过 kernel_thread 的方式(也就是 fork)创建的(init_task 是唯一一个没有通过 fork()产生的进程)。
在405行代码中调用 kernel_thread()执行 kthreadd函数,创建 PID=2的内核线程:

kthreadd函数的任务是管理和调度其他内核线程 kernel_thread。for 循环中运行 kthread_create_list 全局链表中维护的 kthread, 在create_kthread()函数中,会调用 kernel_thread 来生成一个新的进程并被加入到此链表中,因此所有的内核线程都是直接或者间接的以 kthreadd 为父进程。

总结:
(1)init_task()(PID=0)在创建了init进程后,调用 cpu_idle() 演变成了idle进程,执行一次调度后,init进程运行;
(2)1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用do_execve执行 init 函数,演变成 init 进程(用户态1号进程),init 进程是内核启动的第一个用户级进程;
(3)kthreadd(PID=2)进程由0号进程创建,始终运行在内核空间, 负责所有内核线程的调度和管理 。

4.个人理解分析及遇到的一些问题:

上述描述的基本都是书上的内容,比较官方也比较难理解。本章内容不多,操作难度也不大,但理解难度很大。
首先,几乎所有的内核模块均会在start_kernel进行初始化。在start_kernel中,会对各项硬件设备进行初始化,包括一些page_address、tick等等,直到最后需要执行的rest_init中,会开始让系统跑起来。
那么,rest_init这个过程中,会调用调用kernel_thread来创建内核线程kernel_init,它创建用户的init进程,初始化内核,并设置成1号进程,这个进程会继续做相关的系统初始化;
然后,start_kernel会调用kernel_thread并创建kthreadd,负责管理内核中得所有线程,然后进程ID会被设置为2;
最后,会创建idle进程(0号进程),不能被调度,并利用循环来不断调号空闲的CPU时间片,并且从不返回。

问题:
(1)本章学习中遇到了许多陌生的指令和术语,一边操作过程中一边查阅有关资料,但对有些术语还是不太理解。
(2)在自己虚拟机上搭建环境时,Linux-3.18.6内核版本根据书中链接进行下载网速太慢,于是便在Linux官网上进行下载然后解压运行。
(3)“gcc -o init linktable.c menu.c test.c -m32 -static –lpthread”执行这句话的时候gcc报错出现:找不到lpthread?

转载于:https://www.cnblogs.com/aiYY/p/9892889.html

2018-2019-1 20189213《Linux内核原理与分析》第四周作业相关推荐

  1. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果?下落的速度正好 那么13年的长度刚好是地球的最远距离!直径两端 在进行实验楼操作之前,先听授了网易云课堂中孟老师关于"计算机是如何工作的?"的介绍 ...

  2. 2022-2023-1 20222809《Linux内核原理与分析》第一周作业

    Linux内核原理与分析第一周作业 配置环境 1.参考Linux(Ubuntu)系统安装图文教程中第二种借助virtualbox成功配置Ubuntu环境 2.升级更新软件包 可以通过调节分辨率和虚拟机 ...

  3. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  4. 实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  5. 《Linux内核原理与分析》第二周作业

    反汇编一个简单的C程序 1.实验要求 使用: gcc –S –o test.s test.c -m32 命令编译成汇编代码,对汇编代码进行分析总结.其中test.c的具体内容如下: int g(int ...

  6. 2018-2019-1 20189204《Linux内核原理与分析》第三周作业

    OS是如何工作的 学习任务: 阅读学习教材「庖丁解牛Linux 」第2章 学习蓝墨云班课中第三周视频「操作系统是如何工作的?」,并完成实验楼上配套实验二. 云班课学习笔记: 计算机三大法宝 程序存储计 ...

  7. 2018-2019-1 20189206 《Linux内核原理与分析》第六周作业

    linux内核分析学习笔记 --第五章 系统调用的三层机制 学习重点--深入理解系统调用的过程 给MenuOS添加命令 添加命令的方式较为简单,在LinuxKernel/menu/test.c目录下, ...

  8. 20169210《Linux内核原理与分析》第十一周作业

    第17章 设备与模块 关于设备驱动和设备管理,讨论四种内核成分. 设备类型:在所有的linux系统中为了统一普遍设备的操作所分的类. 模块:Linux内核中用于按需加载和卸载目标码的机制. 内核对象: ...

  9. 20169207《Linux内核原理与分析》第五周作业

    这周的任务主要分为两个方面,第一方面,学习MOOC网上视频第三讲并完成配套的实验.第二方面,学习课本的第四章和第六章. 首先从实验开始讲起,前期我们对Linux内核的源码做了一个简单的了解.包括Mai ...

最新文章

  1. ad中pcb双面板怎么设置_PCB的设计规则和加工要求参考
  2. android 主线程调用,Android 主线程和线程之间相互发送消息
  3. 关于SpringMvc实践的一些体会和总结
  4. c#调用c语言的自定义函数,[转]在C#中调用C语言函数(静态调用Native DLL,Windows Microsoft.Net平台)...
  5. 页面平滑过渡全屏切换
  6. SuseLinux详解(3)——开启/关闭防火墙的方法
  7. 廖雪峰Python教程学习笔记
  8. iOS开发人员需要了解的苹果开发者账号与邓白氏编码
  9. 抖音记事本代码html,抖音上用记事本编写爱心小程序教程
  10. LiveVideoStackCon2021 北京站专访:从上云到创新,视频云的新技术、新场景
  11. Unity 接入 ILRuntime 热更方案
  12. python的sdk是什么意思_python sdk是什么
  13. 安装Microsoft Visual Studio 2010 Service Pack 1 ,系统无法找到指定的对象
  14. Word2013制作中国的传统福字在屋门上贴的福字(福倒了)
  15. EndNote X9插入参考文献的格式
  16. 中美知识产权博弈:保护力度标准成最大分歧
  17. 软件开发技术联盟 - 图书系列资源
  18. 李宏毅svm_李宏毅2020 ML/DL补充Structured Learning Structured SVM
  19. php面试题之PHP核心技术
  20. 新学年,推荐一份GIS书单给爱学习的你

热门文章

  1. 计算机视觉python入门_计算机视觉应该怎样入门?
  2. golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布
  3. 安装教程-VMware 12 安装 Windows 10 企业版
  4. 李晓菁201771010114《面向对象程序设计(java)》第十三周学习总结
  5. jQuery学习总结06-插件开发
  6. xshell报编码问题时可以修改xshell编码
  7. Java中String为什么是final
  8. scrollview 与 listView 的显示不全问题
  9. ios开发之.pch文件的使用
  10. hdu 3405 world islands