操作系统是如何工作的?
SG12225045
破解操作系统的奥秘
一、操作系统工作的基础
1.1 存储程序计算机:
由美籍匈牙利数学家冯·诺依曼于1946年提出的,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。冯·诺依曼和同事们依据此 原理设计出了一个完整的现代计算机雏形,并确定了存储程序计算机的五大组成部分和基本工作方法。冯·诺依曼的这一设计思想被誉为计算机发展史上的里程碑, 标志着计算机时代的真正开始。
虽然计算机技术发展很快,但“存储程序原理”至今仍然是计算机内在的基本工作原理。自计算机诞生的那一天起,这一原理就决定了人们使用计算机的主要方式——编写程序和运行程序。
它在体系结构上主要由以下特点:
以运算单元为中心、采用存储程序原理、存储器按地址访问、线性编址空间、控制流由指令流产生、指令由操作码和地址码组成、数据以二进制进行编码。
1.2 堆栈机制:
堆是由程序员自己分配的,需自己释放的。栈是由编译器自动分配和释放的一段内存,主要用来传递参数、保存寄存器的值,保存上下文切换现场。
1.3 中断机制:
中断是CPU提供的允许其他模块打断处理器正常处理过程的机制。常见的中断类别有:程序中断、时钟中断、IO中断、硬件故障中断
二、操作系统(内核)是如何工作
当一个进程在执行一个程序的时候,进来一个中断,CPU首先将当前EIP,ESP压入内核 栈,然后把ESP指向内核栈,EIP指向中断处理的入口,其中最关键的就是TSS,因为TSS中保存了用户态下各个寄存器的信息,所以将用户态下的EIP 和ESP入栈,就相当于对进程之前的一个状态进行保存,以便于从中断返回后继续执行之前任务,然后kernel调用SAVE_ALL来将其他寄存器信息保 存在栈中,接着根据CS EIP指向的中断程序,对中断进行处理。当执行完一个中断后,会通过schedule进行调度,其中最重要的要数switch_to,其会调用 _switch_to函数来进行调度。当中断执行完后,若要返回到用户态,就需要回到最初中断开始的地方继续执行先前任务,这就需要 restore_all将之前保存在内核栈中的值出栈,然后通过iret恢复其计算器的状态,这样我们就又回到了用户态,继续执行之前因中断而暂停的任 务。
三、总结
操作系统工作的核心概念是进程,进程是程序的动态执行。大部分的操作系统都有自己的核心进程,系统启动完成最后的操作就是启动核心进程,然后其他的所有执行程序其实都是这个进程的子子孙孙,而这个核心进程可以控制子子孙孙间同步执行和进程切换以及终止子进程。最后一旦这个核心进程也挂了,或是执行完就是操作系统关闭了。
切换的流程如下:
1.将当前的用户态堆栈的esp、ebp指针保存在当前进程内核栈
2.执行SAVE_ALL,保存进程a的各个寄存器的值到其内核栈中;
3、进入中断处理程序;
4、操作系统调用schedule()函数来进行进程调度,进入进程b的内核栈;
5、执行RESTALL_ALL,恢复现场,恢复进程b的寄存器的值;
6、执行IRET,恢复EIP、ESP以及EFLAGS寄存器;
7、系统从内核态返回到用户态。