一、操作系统工作的基础
1、存储程序的计算机
存储程序的计算机,就是CPU不停的从内存中取指令去执行,每条指令的执行包括IF、ID、EX、MEN、WB五个基本的阶段,计算机的工作就是不停的执行指令的过程。
在冯诺依曼体系结构中,计算机是由控制器、存储器、运算器、输入设备、输出设备构成。计算机在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令,然后再取出下一条指令并执行,如此循环下去直到程序结束指令时才停止执行。LInux操作系统就是通过执行程序时,通过程序的入口地址IP,找到指令,然后CPU不停的从内存中取值执行程序。
2、堆栈(函数调用堆栈)机制
CPU执行的基本单位是进程,每一个进程有对应的栈空间,在系统调用过程之中,处于用户态的程序,通过int 0×80调用内核提供的接口函数,在进入内核态堆栈中会保存应用程序的当前状态,例如:当前cpu各个寄存器的值,程序当前所处的状态,保护现场。进入内核之后,进行系统调用相关的内核程序处理,然后调用结束,将相关内核堆栈中的寄存器,eip ,cs的内容出栈,恢复到用户态去执行程序。所以我们可以说堆栈机制在操作系统之中发挥不可替代的作用,是我们操作系统执行程序过程之中必不可少的条件。
3、中断机制
中断就是会改变CPU执行指令的顺序,通常是与CPU内部或者外部硬件产生的电信号相对应。中断提供了一种新的方式让CPU跳到正常程序代码之外的地方去执行指令。当外界发出一个中断irq,通过中断控制器,我们可以找到该终端对应的中断向量表,然后通过INTR线将中断控制器与CPU相连,CPU通过读中断控制器的内容去执行相应中断服务程序(这里涉及到堆栈,对当前应用程序现场的保护)。中断机制可以更好的让CPU相应外面的事件,提高了CPU的利用率。在系统调用过程之中设计到软中断,在ARM中通过SWI来进行系统调用,在X86中系统调用是通过int 0×80来进行系统调用,软中断机制,是通过触发相关的指令产生对内核的中断,来进行相关的系统调用。所以说中断是多进程能够正常执行以及进程间的切换的必不可少的要素。
二、内核是如何工作的之菜鸟理解
操作系统是由内核与应用程序组成,在菜鸟看来内核就是计算机操作系统之中真正的管家,他不仅通过设备驱动程序管理相关的硬件设备,同时为处于用户态的应用程序提供系统调用的接口,还必须对系统的各种资源进行合理的分配。这就好像一个管家对下管理底层的用人,对上给主人提供各种服务方案。
操作系统的状态分为用户态和内核态,操作系统的工作原理就是不断执行程序的过程,一般应用程序都工作在用户态,只有在系统调用的时候才进入内核态,调用相关的内核处理函数。
我们编写的应用程序经过编译连接,形成可执行程序,保存在相关的硬盘上,当程序在操作系统上运行的时候就形成了一个进程。操作系统对进程的管理包括,为每一个进程分配相应的地址空间,以及对应的进程控制块PCB。当进程之间出现任务的切换之时,就会涉及对进程的调度和切换上。进程的调度主要利用schedule()这个函数;进程的切换主要是用到宏switch_to;
菜鸟简单以基于时间轮转的任务切换来说明一下,当一个进程的时间片用完的时候,操作系统会调用schedule(),进行任务切换。这样操作系统,当调度器获得一个进程的PCB的时候,就会将任务切换到当前PCB任务块对应的进程去执行。在执行之前会将上次任务的PCB入栈,在整个队列之中根据优先级动态的原则执行哪些在处于就绪态优先级比较高的程序。当前程序随着时间的执行,优先级有所降低,CPU根据队列中处于就绪态的任务优先级情况,进行相关的任务切换。(用李老师的话讲就是动态优先,兼顾公平的原则)
操作系统任务切换大体的工作流程如下:
1、操作系统将EIP、ESP压入内核栈。其中,ESP指向内核栈栈顶,EIP指向中断处理程序的入口;
2、执行SAVE_ALL,保存进程a的各个寄存器的值到其内核栈中;
3、进入中断处理程序;
4、操作系统调用schedule()函数来进行进程调度,进入进程b的内核栈;
5、执行RESTALL_ALL,恢复现场,恢复进程b的寄存器的值;
6、执行IRET,恢复EIP、ESP以及EFLAGS寄存器;
7、系统从内核态返回到用户态。