zoukankan      html  css  js  c++  java
  • 课程学习总结报告

    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,若有必要,返回用户态

    五、 进程调度

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

  • 相关阅读:
    elastic
    Leetcode题库 第十行
    Leetcode题库-实现strStr()
    Redis持久化
    Redis的数据结构及应用场景
    Redis缓存的淘汰策略
    Redis缓存常见问题
    Redis面试题1
    消息队列的原理及选型
    【转载】java高并发/mysql/mybatis/spring博客
  • 原文地址:https://www.cnblogs.com/H1K777/p/13275978.html
Copyright © 2011-2022 走看看