《Linux内核原理与分析》第九周作业


一.本周内容概述:

  • 阐释linux操作系统的整体构架
  • 理解linux系统的一般执行过程和进程调度的时机
  • 理解linux系统的中断和进程上下文切换

二.本周学习内容:

1.阐释linux操作系统的整体构架

宏观上来说,上图很好的反应了Linux操作系统的架构图。首先,Linux系统包含一个内核,内核,实质是一个软件,特殊的地方在于,内核具备直接操纵CPU资源,内存资源,I/O资源等的能力。

内核之外是系统调用。系统调用这层,相当于内核增加了一层封装。将内核操作的复杂性封装起来,对外层提供透明的调用。系统调用可以理解为操作系统的最小功能单位,所有有应用程序,都是将通过将系统调用组合而成的。

系统调用之外,就是应用程序,各种各样的应用程序。特殊的有两个,一个是Shell,它是一个特殊的应用程序,俗称命令行。类似于windows的cmd,是一个命令解释器。有些应用程序是基于Shell做的,而不是基于系统调用。另一个特殊的是公用函数库。系统调用是操作系统的最小功能单位,一个Linux系统,根据版本不同,大约包含240~260个系统调用。为了使得操作更为简单,更加便于应用程序使用,Linux系统对系统调用的部分功能进行了再次封装,形成了公用函数库,以供应用程序调用。公用函数库中的一个方法,实质是若干个系统调用以特定的逻辑组合而成。

2.理解linux系统的一般执行过程和进程调度的时机

  • 2.1 Linux系统的一般执行过程分析
  • 最一般的情况:
  • 正在运行的用户态进程X切换到运行用户态进程Y的过程
  • 正在运行的用户态进程X
  • 发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
  • SAVE_ALL //保存现场
  • 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换
  • 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
  • restore_all //恢复现场
  • iret - pop cs:eip/ss:esp/eflags from kernel stack
  • 继续运行用户态进程Y
  • 2.2 Linux系统执行过程中的几个特殊情况
  • 通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;
  • 内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;
  • 创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork; 加载一个新的可执行程序后返回到用户态的情况,如execve;
  • 2.3 内核与舞女
  • 3G仅内核态可以访问
  • 2.4 进程调度的时机

linux内核通过schedule函数实现进程调度,schedule函数在运行队列中找到一个进程,把CPU分配给它。调用schedule函数一次就是调度一次。调用schedule函数的时候就是进程调度的时机。

调用schedule函数有两种方法:

  • 进程主动调用schedule()
  • 松散调用

进程调度时机如下:

  • 用户进程通过特定的系统调用主动让出CPU
  • 中断处理程序在内核返回用户态时进行调度
  • 内核线程主动调用schedule函数让出CPU
  • 中断处理程序主动调用schedule函数让出CPU,涵盖第一和第二种情况
  • Linux内核中没有操作系统中定义的线程概念,从内核角度看,不管是进程还是内核线程都对应一个task_struct数据结构,本质上都是进程,linux系统在用户态实现的线程库pthread是通过在内核中多个进程共享一个地址空间实现的。

一般来说,cpu在任何时刻都处于以下3种情况之一:

  • 运行于用户空间,执行用户进程上下文
  • 运行于内核空间,处于进程(一般是内核线程)上下文
  • 运行于内核空间,处于中断上下文。

内核线程以进程上下文的形式运行在内核空间中,本质上还是进程,但是它还有调用内核代码的权限,比如主动调用schedule函数让出cpu等

3.理解linux系统的中断和进程上下文切换

  • 3.1 Linux系统的中断

    中断在本质上都是软件或者硬件发生了某种情形而通知处理器的行为,处理器进而停止正在运行的指令流(当前进程),对这些通知做出相应反应,即转去执行预定义的中断处理程序(内核代码)。

    中断分为硬中断和软中断。

    硬中断就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断),CPU在执行每条指令后会检测这两根引脚的电平,如果是高电平,说明有中断请求,CPU就会中断当前程序的执行去处理中断。

    软中断包括除零错误,系统调用、调试断点等在CPU执行指令过程中发生的各种特殊情况统称为异常。异常一般分为3种,故障,退出,陷阱。区别是故障可以恢复到当前指令,退出是不可恢复的严重故障,陷阱是程序主动产生的异常,例如int 0x80。
  • 3.2 Linux系统的进程上下文切换

为了控制进程的执行,内核必须有能力挂起正在CPU中运行的进程,并恢复执行以前挂起的某个进程,这种行为被称为进程切换、任务切换或进程上下文切换。

进程上下文包含了进程执行需要的所有信息

  • 用户地址空间
  • 控制信息
  • 硬件上下文
  • CR3寄存器
  • ESP寄存器
  • EIP寄存器及其他寄存器

linux操作系统内核为用户提供的服务:

  • 通过系统调用的形式为进程提供各种服务
  • 通过异常处理程序与中断服务程序为硬件的正常工作提供各种服务
  • 通过内核线程为系统提供动态的维护服务和中断服务中可延时处理的任务

4.实验楼实验内容:进程调度相关源代码跟踪和分析

  • 重新克隆一个menu,然后编译内核。

    实践截图如下:

  • 打开调试模式,另打开一个窗口进行gdb调试,并设置断点。

    实践截图如下:

  • 使用gdb跟踪分析schedule()函数,按c执行,停在schedule函数断点处。

    实践截图如下:

  • pick_next_task断点处某种调度策略和调度算法选择了下一个进程来切换,context_switch断点处用来实现进程的切换。

    实践截图如下:


三.总结与疑难

通过实验可知schedule()函数用来选择一个新的进程来运行,并调用context_switch()进行上下文的切换,这个宏调用switch_to()来进行关键上下文切换,其中pick_next_task()函数封装了进程调度算法。中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。


四.下周计划

  • 完成书本上的课后习题
  • 继续使用虚拟机环境研究内核

2019 年 11 月 16 日

2019-2020-1 20199329《Linux内核原理与分析》第九周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

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

    写之前回看了一遍秒速五厘米:如果

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

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. 《深入理解 Java 虚拟机》读书笔记:线程安全与锁优化

    正文 一.线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那 ...

  2. CSS躬行记(3)——CSS属性拾遗

    一.粘滞定位 粘滞定位(sticky)与相对定位类似,既不会脱离正常流,也不会改变元素盒类型,并且会保留原先所占的空间.它会相对于包含块偏移,它的包含块分为两种,第一种和绝对定位一样:第二种是最近的滚 ...

  3. Java 运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  4. Linux操作系统及调用接口

    Linux操作系统包含以下各子系统: 系统调用子系统:操作系统的功能调用同一入口: 进程管理子系统:对执行程序进行生命周期和资源管理: 内存管理子系统:对系统的内存进行管理.分配.回收.隔离: 文件子 ...

  5. c期末笔记(4)

    未命名易错点 1.0<y<10 在c语言中,0<y<10不是一个正确的表达式,应该利用逻辑运算符替换(y>0&&y<10或者!(y<=0||y ...

  6. iapp,iapp http请求,iapp解析json数据

    iapp发送http请求,并解析json数据 //http操作 t() { s a = "http://wap.baidu.com/" //目标url hs(a, null, nu ...

  7. 定位 iframe

    定位iframe # 1.有id,并且唯一,直接写id driver.switch_to_frame("x-URS-iframe") driver.switch_to.frame( ...

  8. Exercise 1测试

    此篇博客旨在测试Exercise 1,发现其中问题并解决. 首先,我们使用codeblocks对Exercise 1进行编译.结果如下: 可以发现经编译后的Exercise 1并无编译错误,只有两个w ...

  9. mysql> 12 simple but staple commands

    Edit at:  2019-12-28 16:52:42 1.mysql -u+username -p+password  --> connect mysql 2.use databasena ...

  10. spark 大杂烩

    累加器 val dataRdd = sc.makeRDD(List(1, 2, 3, 4), 2) var sum = 0 //累加器可以收集driver和各个excuter中累加的结果 //如果此处 ...