您的位置:首页 > 运维架构 > Linux

Linux操作系统的工作机制

2013-06-29 11:51 295 查看
王迅 sg050

本文通过分析操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制来尝试破解操作系统的奥秘。

存储程序计算机就是一般意义上的冯·诺依曼计算机,因为存储程序计算机最早是由著名数学家冯·诺依曼等人在1946年总结并明确提出来的。本科时候在微机课本上第一次接触到冯·诺依曼体系结构,它是由运算器、存储器、控制器、输入输出设备组成。然而除此之外,它还有一些其他要点:

1.计算机完成任务是由事先编号的程序完成的;

2.计算机的程序被事先输入到存储器中,程序运算的结果,也被存放在存储器中;

3.计算机能自动连续地完成程序;

4.程序运行的所需要的信息和结果可以通输入输出设备完成。

堆栈是内存当中一块区域,当函数调用的时候就会用到堆栈,通过保存帧指针ebp、栈指针esp、下一条命令cs:eip来使得函数调用完毕之后,能够正确的返回原程序,顺序执行函数调用语句的下一条语句。摸我

中断发生在多进程当中,当cpu收到外部中断信号、异常或者内部系统调用----int 0x80软中断时,停下当前工作,保护好现场,根据中断向量号进入中断向量表当中,根据表中的地址跳转到中断服务程序,执行相应的操作。中断机制的产生是为了应付由于计算机越来越复杂,而产生的一些突发事件,比如缺页异常。

虽然用户态下和内核态下工作的程序有很多差别,但最重要的还是在于特权及的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间该进程是运行在用户态下的,只有在他没有权利和能力完成某项工作时,操作系统才会帮助他,将进程切换到内核态。

下面通过中断处理过程描述linux下,进程在用户态与内核态之间的转换。

引用老师的美图:



通过中断和异常机制能够实现用户态与内核态之间的切换,为简单起见,将异常页当做中断的一种,进程在用户态下执行,当发生中断时,esp、eip被压入内核栈,esp指向当前进程的内核栈,eip指向中断处理入口,接着SAVE_ALL将剩余各寄存器的值压入内核堆栈,然后执行中断处理程序,在中断处理过程中进程可能间接调用是schedule()进行进程调度,确定下一个将要执行的进程,通过switch_to宏切换进程,将ss和esp切换到新进程的内核栈。这里有必要说一下,第一,用户态程序无法直接调用schedule,只能通过系统调用间接影响schedule的执行;第二,一个完整的中断处理过程实际上schedule之前代表当前进程执行prev,schedule之后代表将要被执行的进程执行next。新进程的内核栈中保留来上次被终止运行时的执行断点,restore_all()函数恢复新进程的各寄存器值,最后IRET指令把新进程的内核栈中的esp、eip等恢复到新进程的用户栈中,即完成了从内核态到用户态的切换。

参考资料:

1.存储程序计算机

2.用户态与内核态之间的切换

3.孟老师的微博
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: