课程学习总结报告

Linux操作系统复习总结

首先贴出我们亲爱的孟宁老师的网课链接https://mooc.study.163.com/course/1000029000?tid=2403023011&_trace_c_p_k2_=7bf1550a6c8b44218d53af639b8981d0#/info,不仅有孟大神视频课程,还有相应的测试题,复习必备。

下面是我对一些知识点的总结:

一、      open函数的执行过程

  1. open执行去C库里面,找到Int80 05指令封装。80为中断向量号,05为系统调用号
  2. 从idtr寄存器中读取中断向量表的基地址,找到IDT。
  3.  trap-init调用set_system_gate等函数对中断向量表中的每一项进行初始化,并将指令所在地址的cs、eip、DPL以及门类型和中断向量号进行绑定。
  4. 根据中断向量号128找到第128项,其中包括cs和eip,再根据gdtr、cd、eip找到所要执行指令的地址,再进行系统调用。
  5. 进入系统调用,保存现场,对指令进行分析得到系统调用号05根据系统调用号,找到系统调用表中的sysopen的入口,即sysopen的函数指针。
  6. sysopen对文件进行查找,得到文件控制块和文件类型。
  7. 根据文件类型调用相应系统的文件打开函数,并在系统文件打开表中创建一个file,根据文件控制块向其中填充file_operation以及偏移量等项
  8. 返回到进程,进入进程文件打开表,其中有一个fd数组,将fd数组未使用的最低索引指向系统文件打开表中的相应项,然后将fd数组的下标返回给open。

二、      中断和异常处理流程

硬件处理:

  1. 确定与中断或者异常关联的向量i(0~255)
  2. 读idtr寄存器指向的IDT表中的第i项
  3. 从gdtr寄存器获得GDT的基地址,并在GDT中查找, 以读取IDT表项中的段选择符所标识的段描述符
  4. 确定中断是由授权的发生源发出的。
  5. 判断是否发生特权级变化。
  6. 若发生了特权级变化,即从用户态进入了内核态,则保存进程的ss和esp。若未发生直接跳过
  7. 保存eflags、cs、eip
  8. 若为异常,保存硬件出错码error_code,若中断则跳过
  9. 加载IDT相应项的cs、eip
  10. 进入相对应的异常处理函数,检查栈中是否有error_code,若无则将0压入栈
  11. 将对应的C处理函数压入栈,并跳转到error_code函数,将数据按照pt_regs的结构压入栈内,调用相应的C处理函数,进行异常处理,并将这个位置写入fs
  12. 异常处理返回
  13. 进入interrupt数组,将中断向量号入栈,并调用common_interrupt函数。
  14. 按照pt_regs结构保存,。
  15. 调用do_IRQ函数,根据中断向量号i找到irq_desc数组的第i项,并调用handle_level_irq对irqaction链表进行扫描,找到中断源,并执行相对应的action
  16. 中断处理返回

异常处理:

  1. 进入相对应的异常处理函数,检查栈中是否有error_code,若无则将0压入栈
  2. 将对应的C处理函数压入栈,并跳转到error_code函数,将数据按照pt_regs的结构压入栈内,调用相应的C处理函数,进行异常处理,并将这个位置写入fs
  3. 异常处理返回

中断处理:

  1. 进入interrupt数组,将中断向量号入栈,并调用common_interrupt函数。
  2. 按照pt_regs结构保存,。
  3. 调用do_IRQ函数,根据中断向量号i找到irq_desc数组的第i项,并调用handle_level_irq对irqaction链表进行扫描,找到中断源,并执行相对应的action
  4. 中断处理返回

中断或者异常返回:

  1. 用保存在栈中的值装载cs、eip和eflags寄存器。如果一个硬件出错码曾被压入栈中, 那么弹出这个硬件出错码。
  2. 检查被中断进程在被中断的时候是内核态还是用户态)若内核态,iret终止执行;否则,转入3。
  3. 从栈中装载ss和esp寄存器。这步意味着返 回到与旧特权级相关的栈。

三、 Linux启动

  1.根文件系统挂载

  2.启动一个init进程,完成后,启动后续进程。

四、 定时器中断

  定时器溢出而申请的中断

  解决外设与cpu速度不匹配的问题。

  当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。

  在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。

 

  普通进程可以被中断或异常处理程序打断

  异常处理程序可以被中断程序打断

  中断程序只可能被其他的中断程序打断

 

中断:

      1)  将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。

      2)  将CPSR复制到相应的SPSR中。

      3)  根据异常类型,强制设置CPSR的运行模式位。

      4)   强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

 

恢复:

  1)   将连接寄存器LR的值减去相应的偏移量后送到PC中。

  2)   将SPSR复制回CPSR中。

  3)   若在进入异常处理时设置了中断禁止位,要在此清除

 

流程

  1,若有必要,进入核心态

  2,在内核态堆栈保存上下文(用户态/核心态)

  3,调用asm_do_IRQ #处理中断

  4,恢复上下文

  5,若有必要,返回用户态

五、 进程调度

 

 以上就是我觉得比较重要的几个大题的复习点,有不足的地方欢迎补充呀。

posted @ 2020-07-09 20:24  H1K  阅读(155)  评论(0编辑  收藏  举报