码迷,mamicode.com
首页 > 系统相关 > 详细

Linux课程学习总结报告

时间:2020-07-09 19:24:13      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:图片   理解   产生   通过   地址   level   info   控制器   启动过程   

Linux的启动过程

1.启动并加载BIOS,对硬件进行检测,查找并加载MBR。

2.找到MBR后,存储BootLoader信息,加载GRUB。

3.查找并加载kernel。

4.装载驱动,挂载rootfs,执行/sbin/init。

5.OS初始化后,执行runlevel程序。

6.启动指定级别的服务。

一 中断的学习

1.我认为中断最大的作用就是可以及时的切换执行程序,这对实时系统很重要。

2.硬中断,软中断,与中断上下文

  当中断产生的时候,需要中断处理程序及时处理请求内容,而请求内容的工作量可能较多,一时做不完。所以需要先处理一部分要紧的,如IO设备中的待处理信息需要及时处理,这个交给硬中断处理,而剩下不是特别紧迫且耗费时间较长的事件则硬中断之后处理,也就是软中断来完成。硬中断处理阶段叫做中断上文,而软中断处理部分叫中断下文,合称为中断上下文。

  关于软中断有两种处理机制:

  第一,小任务处理机制。它使用的数据结构为tasklet_struct,每一个结构代表一个独立的小任务。

技术图片

 

 

 

技术图片

 

 

state的取值为TASKLET_STATE_SCHED或TASKLET_STATE_RUN。TASKLET_STATE_SCHED表示小任务已被调度,正准备投入运行,TASKLET_STATE_RUN表示小任务正在运行。count是小任务的引用计数器。如果它不为0,则小任务被禁止,不允许执行;只有当它为零,小任务才被激活,并且在被设置为挂起时,小任务才能够执行。结构中的func就是下半部中要推迟执行的函数 ,data是它唯一的参数。

软中断的另外一种工作方式是工作队列。它和小任务处理机制的不同在于:

Tasklet在软中断的上下文中运行,所有的代码必须 是原子的,不能睡眠、不能使用信号量或其它产生阻塞的函数 。

工作队列在一个内核线程上下文运行,并且可以在 延迟一段确定的时间后才执行;有更多的灵活性, 它可以使用信号量等能够睡眠的函数。
3.中断大流程
(1)中断控制器通过IRQ接收到中断信号,查找中断向量表找到对应的中断向量,将中断向量传递给CPU;

(2)CPU会在运行下一条指令之前。检查是否发生中断。

(3)如果有中断的话CPU应答中断时会去查找对应的中断服务历程。确定其是否合法。

(4)若合法则进行中断处理。首先在内核栈中保存以前的ss和esp值,装载新的ss和esp寄存器。保存eflags、cs和eip的值。处理异常。

(5)中断、异常处理完后。产生iret指令。装载cs、eip、eflags。返回到用户态。或者如果有中断嵌套的话。返回到上一个中断嵌套。

 详细一点就是:

硬中断流程

(1)CPU确定具体的中断向量。

(2)根据中断向量对比IDT(中断描述符表)找到相应的中断门,然后根据中断门中的段选择符对比GDT(全局描述表)找到中断服务程序的段基地址。

(3)判断中断的特权级别,检查被中断程序的特权是否低于中断程序的特权级。

(4)检查特权级别是否发生变化,如果发生变化(用户态=>内核态),则设置内核的堆栈,读取当前程序的tss段(通过tr寄存器读取)来选择新特权级的ss和esp指针,然后保存旧的ss和esp指针。如果特权级别没有发生变化(内核态),如发生故障,则用引起异常的指令地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行。

(5)在栈中保存eflags、cs和eip的内容。如果有硬件出错码,则将它保存在栈中。

(6)装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。这对寄存器值给出中断或者异常处理程序的第一条指定的逻辑地址。

技术图片

 

 二 进程的学习

0号进程是所有进程的父进程, 0号创建init进 程,init完成相关初始化,执行相关程序。 

进程除了基础概念,还有以下概念。 

1.进程的五种状态

   

 技术图片

 

 技术图片

 

 2.进程切换

进程切换指的就是内核挂起在CPU上正在执行的进程,并恢复以前挂起的某个进程的执行。

进程切换由两步组成:

(1)切换页全局目录以安装一个新的地址空间。

(2)切换内核态堆栈和硬件上下文。硬件上下文提供了内核执行新进程所需要的所有 信息,包括cpu寄存器 。

硬件上下文的切换:

switch_to宏执行进程切换,schedule()函数调用这个宏一调度一个新的进程在CPU上运行 。技术图片

 

 

 switch_to利用了prev、next和last三个参数 

- prev:指向当前进程

- next:指向被调度的进程

-last:输出参数,表示被切换进程的描述符在内存中 的位置 

 如果prev表示切换出的进程描述符,next表示 切换进的进程描述符;进程切换某种程度上可 以理解为这样的行为:保存prev上下文,用 next上下文代替prev。 

 

3.进程调度

进程调度的功能:

(1)记录系统中所有进程的执行情况。

(2)选择占有处理机的进程。

(3)进行进程上下文切换。—个进程的上下文(context)包括进程的状态、有 关变量和数据结构的值、机器寄存器的值和PCB以及 有关程序、数据等。 

进程调度的时机:

(1)进程状态发生变化时。

(2)当前进程时间片用完。

(3)进程从系统调用返回到用户态。

(4)中断处理后,进程返回到用户态。

Linux进程调度采取的是动态优先级法,调度的对象是可运行队列。在调度过程中,调度程序检查可运行队列中所有进程的权值, 选择其中权值最大的进程做为下一个运行进程。 

下图就是可运行队列的结构

技术图片

 

 Linux进程调度对实时进程和普通进程的调度策略是有所不同的。

针对普通进程:

(1)普通进程(非交互进程)用完时间片后直接成为过期进程。

(2)交互进程用完时间片后还是会放到活动进程中,不过时间片需要重新填写。

(3)如果过期进程中最老的那个等待了相当长的时间或者过期进程中有比用完时间片的交互进程优先级高的,则将交互进程放入过期队列中。

问题:当活动进程为空时,调度程序如何处理呢?

答:会将过期队列的所有进程重新放入活动进程中去。

针对实时进程:

实时进程总会被当作活动进程来处理。高优先级的进程优先处理。

技术图片

 

 

三 感想

通过两位老师的讲解,了解了linux内核,中断和进程管理的大致流程和文件系统的相关知识点,但是由于C语言和汇编基础薄弱,后续还需要细细琢磨,多方验证。 

 

 

 

 

 

 

 

 

 

  

Linux课程学习总结报告

标签:图片   理解   产生   通过   地址   level   info   控制器   启动过程   

原文地址:https://www.cnblogs.com/bafaiyuqiao/p/13273127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!