Linux操作系统复习总结
首先贴出我们亲爱的孟宁老师的网课链接https://mooc.study.163.com/course/1000029000?tid=2403023011&_trace_c_p_k2_=7bf1550a6c8b44218d53af639b8981d0#/info,不仅有孟大神视频课程,还有相应的测试题,复习必备。
下面是我对一些知识点的总结:
一、 open函数的执行过程
- open执行去C库里面,找到Int80 05指令封装。80为中断向量号,05为系统调用号
- 从idtr寄存器中读取中断向量表的基地址,找到IDT。
- trap-init调用set_system_gate等函数对中断向量表中的每一项进行初始化,并将指令所在地址的cs、eip、DPL以及门类型和中断向量号进行绑定。
- 根据中断向量号128找到第128项,其中包括cs和eip,再根据gdtr、cd、eip找到所要执行指令的地址,再进行系统调用。
- 进入系统调用,保存现场,对指令进行分析得到系统调用号05根据系统调用号,找到系统调用表中的sysopen的入口,即sysopen的函数指针。
- sysopen对文件进行查找,得到文件控制块和文件类型。
- 根据文件类型调用相应系统的文件打开函数,并在系统文件打开表中创建一个file,根据文件控制块向其中填充file_operation以及偏移量等项
- 返回到进程,进入进程文件打开表,其中有一个fd数组,将fd数组未使用的最低索引指向系统文件打开表中的相应项,然后将fd数组的下标返回给open。
二、 中断和异常处理流程
硬件处理:
- 确定与中断或者异常关联的向量i(0~255)
- 读idtr寄存器指向的IDT表中的第i项
- 从gdtr寄存器获得GDT的基地址,并在GDT中查找, 以读取IDT表项中的段选择符所标识的段描述符
- 确定中断是由授权的发生源发出的。
- 判断是否发生特权级变化。
- 若发生了特权级变化,即从用户态进入了内核态,则保存进程的ss和esp。若未发生直接跳过
- 保存eflags、cs、eip
- 若为异常,保存硬件出错码error_code,若中断则跳过
- 加载IDT相应项的cs、eip
- 进入相对应的异常处理函数,检查栈中是否有error_code,若无则将0压入栈
- 将对应的C处理函数压入栈,并跳转到error_code函数,将数据按照pt_regs的结构压入栈内,调用相应的C处理函数,进行异常处理,并将这个位置写入fs
- 异常处理返回
- 进入interrupt数组,将中断向量号入栈,并调用common_interrupt函数。
- 按照pt_regs结构保存,。
- 调用do_IRQ函数,根据中断向量号i找到irq_desc数组的第i项,并调用handle_level_irq对irqaction链表进行扫描,找到中断源,并执行相对应的action
- 中断处理返回
异常处理:
- 进入相对应的异常处理函数,检查栈中是否有error_code,若无则将0压入栈
- 将对应的C处理函数压入栈,并跳转到error_code函数,将数据按照pt_regs的结构压入栈内,调用相应的C处理函数,进行异常处理,并将这个位置写入fs
- 异常处理返回
中断处理:
- 进入interrupt数组,将中断向量号入栈,并调用common_interrupt函数。
- 按照pt_regs结构保存,。
- 调用do_IRQ函数,根据中断向量号i找到irq_desc数组的第i项,并调用handle_level_irq对irqaction链表进行扫描,找到中断源,并执行相对应的action
- 中断处理返回
中断或者异常返回:
- 用保存在栈中的值装载cs、eip和eflags寄存器。如果一个硬件出错码曾被压入栈中, 那么弹出这个硬件出错码。
- 检查被中断进程在被中断的时候是内核态还是用户态)若内核态,iret终止执行;否则,转入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,若有必要,返回用户态
五、 进程调度
以上就是我觉得比较重要的几个大题的复习点,有不足的地方欢迎补充呀。