操作系统工作机制分析
SA196/yanzl
------------------------------------------------------------------------------------------------------------------
整个计算机操作系统的工作是在硬件的支持下辅助一些软件保证机器各项工作的正常运行。
保证了计算机的正常工作的各项软硬件条件如下:
1. 存储程序计算机 进程描述(pcb)
2. 堆栈(函数调用) 4.进程切换 --------》 进程关系
3. 中断 进程调度
-----硬件提供的三个法宝---- | -----------软件------------
操作系统:-》抽象成根据中断 来启用不同的处理程序(进程)有序正常的完成各项工作
分析操作系统的工作现在可以微观的分析保证计算机工作的中断,进程切换等等问题上,下面我们来分析上面提到的几项的工作机制
1.存储程序计算机:
存储程序计算机 => 结构(cpu和mm由bus连接)+工作机制
c代码的执行 =>函数调用堆栈
图1:
cpu中有 cs:eip -> 其指向的地方获得cpu的控制权
ebp esp -> 指向程序的堆栈
经典的冯诺依曼体系计算机需要3个最基本的部分:CPU、MM 和 BUS。用户程序分段存在存储器中,包括cs ds es ss段等。CPU通过cs:eip寻址存储器空间,找到下一条将要执行的指令和数据,顺序执行。通过改变eip的指向,改变程序执行方向。
----------------------------------------------------
2.中断机制
进程在执行过程中记忆了cpu的状态,用于进程之间的切换;
图2:
中断的三种类型:I/O中断 / 时钟中断 / 系统调用
中断处理过程:
中断发生的时候:
cpu工作(堆栈切换进入内核态) cpu->int 0x80
->1.当前eip esp 压入内核栈(要知道内核堆栈栈顶处,tss解决)
->2.把esp指向内核栈 eip指向中断处理程序入口
每个cpu对应一个tss,总是记录当前cpu的很多状态,信息等;
进入内核后(进入system_call())
kernel工作:->1.SAVE_ALL(把其他的寄存器都保存到内核栈)
->2.错误处理(跳过)
->3.syscall_table() -进入中断处理程序-syscall_exit
->4.X?
->5.restore all
cpu工作->执行iret(堆栈切到用户态)
整个过程示意图如下:(图3)
-------------------------------------------------------------------------------
3.进程切换
图3中X?代表进程切换,处理完终端后会选择一个进程,该进程可能是前面的进程也可能是新的进程
我们知道每个进程对应一个内核态堆栈和用户态堆栈,在进行X?进程切换的时候可能会有进程堆栈的切换
这时会有 prve 和next 的堆栈
中断 中断返回 和 进程切换没有按照正常的函数调用堆栈
进程的状态:就绪 运行 阻塞
进程的切换和调度过程
系统调用后期执行syscall_exit_work -> work pending ->schedule()
schedule()//决定是否要执行调度
schedule()的工作:
->1.pick_next_task(rq)//选择一个进程
->2.context_awitch()//上下文切换
->关键切换 switch_to( prev , next, last) 如图4
图4:
这段代码工作在内核态
(重要)分析过程:
1.把状态 和 ebp 保存在prve的堆栈
2.save esp 和 restroe esp 切换了进程进入了next的堆栈
prve_ip指向立即数lf 保存标号1的位置
next_ip 指向标号1的位置,压入next的堆栈
jmp里面 switch_to的函数堆栈
进程切换是从内核进程角度来做的,
Q1:堆栈切换时间点 eip切换时间点?????next进程从哪里开始?
-》标号1开始 eip 指向next堆栈 开始执行next进程
操作系统:-》根据中断 来启用不同的处理程序