浅析Linux操作系统是如何工作的

实验五 SA12226267

Linux操作系统工作的基础

存储程序计算机

存储程序计算机最早是由著名数学家冯·诺伊曼等人在1946年总结并明确提出来的,因此又被称为冯·诺伊曼计算机。存储程序和程序控制原理的要点是,程序输入到计算机中,存储在内存储器中(存储原理),在运行时,控制器按地址顺序取出存放在内存储器中的指令(按地址顺序访问指令),然后分析指令,执行指令的功能,遇到转移指令时,则转移到转移地址,再按地址顺序访问指令(程序控制)。存储程序计算机在体系结构上主要特点有:

1.计算机硬件系统由运算器、存储器、控制器、输入设备、输出设备五大部件组成并以运算器为中心

2.采用存储程序原理

3.存储器是按地址访问、线性编址的空间

4.控制流由指令流产生

5.指令由操作码和地址码组成

6.数据以二进制编码

7.在执行程序和处理数据时必须将程序和数据从外存储器装入主存储器中,然后才能使计算机在工作时能够自动调整地从存储器中取出指令并加以执行。

堆栈(函数调用堆栈)机制 在函数调用时需要用到堆栈,需要保存函数调用前的状态,然后进入新的函数栈执行函数,执行完函数调用后需要返回到调用点,整个过程都是依靠几个寄存器ebp,esp,eip等完成的,具体过程参见实验一http://blog.csdn.net/nkguohao/article/details/8937571。中断机制中断机制满足了系统及时响应突发事件的需求,并且满足了计算机多进程的实现。当cpu收到外部的中断信号时,能够及时处理中断请求,保证了系统的实时性。很多教材都提到:讨论中断就不得不提及异常。异常和中断不同,它在产生时必须要考虑与处理器的时钟同步,因此,异常也常常称为同步中断,在处理器执行到由于编程失误而导致的错误指令(如被0除)的时候,或者是在执行期间出现特殊情况(例如缺页),必须要靠内核来处理的时候,处理器就会产生一个异常。因为许多处理器体系结构处理异常以及处理中断的方式类似,因此,内核对中断与异常的处理很类似。中断产生后首先告诉中断控制器,然后告诉操作系统内核。此时,内核会执行一个叫做中断处理程序或中断处理例程的函数。这里特别要说明,中断处理程序是和特定中断相关联的,而不是和设备相关联,如果一个设备可以产生很多中断,那么该设备的驱动程序也就需要准备多个这样的函数。中断处理程序是管理硬件的驱动程序的一部分,如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序,驱动程序注册中断处理程序可以通过request_irq()函数实现。中断是可能随时发生的,因此必须要保证中断处理程序也能随时执行,中断处理程序也要尽可能的快速执行,只有这样才能保证尽可能快地恢复中断代码的执行。所以通常都会将中断处理切为两个部分或两半。中断处理程序上半部(top half)—接收到一个中断,它就立即开始开始执行,但只做严格时限的工作,这些工作都是在所有中断被禁止的情况下完成的。能够被允许稍后完成的工作推迟到下半部(bottom half)去,此后,下半部会被执行。通常情况下,下半部都会在中断处理程序返回时立即执行。可以这样简单描述,进程在执行过程中,接收到中断请求(中断信号)后,CPU会根据该进程的TSS段(保存有硬件上下文)将SS和ESP设置为指向本进程的内核栈。然后将当前在用户态进程的eflags,cs及eip的内容压入到该进程的内核栈中,强制使CS:EIP指向对应中断类型的中断处理程序入口,而在中断处理程序中会调用SAVE_ALL宏来将剩余的寄存器的值压入内核堆栈。然后内核根据中断的类型执行相应的中断服务程序。当中断服务程序执行完毕后,内核会执行schedule函数进行进程调度以选择出将要执行的进程并调用__switch_to函数将SS和ESP切换到即将要执行的进程的内核栈。此时栈中保存了即将运行进程的执行断点,内核调用restore_all函数来将程序的执行断点恢复至各个寄存器,然后执行iret指令将eflags,CS和EIP,SS和ESP(指向进程的用户栈地址)从内核栈中恢复。此时,系统完成从内核态到用户态的转换。Linux操作系统工作的原理在Linux操作系统中,系统的工作状态分为用户态和内核态,应用程序工作的状态成为用户态,内核运行时的状态称为内核态。处于用户态的程序不能访问内核态的代码和数据,所以这样就保证了系统的安全性。当用户态的应用程序操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。由用户态进入内核态通常有三种方式:系统调用,异常以及外围设备的中断。可以说,三种方式都是通过中断机制从用户态进入内核态的。1.系统调用是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如创建新进程的函数fork()实际上就是执行了一个系统调用。系统调用的机制其核心还是中断机制。2.异常在上面谈中断机制是已经提到过,异常也称为同步中断,在处理器执行到由于编程失误而导致的错误指令(如被0除)的时候,或者是在执行期间出现特殊情况(例如缺页),必须要靠内核来处理的时候,处理器就会产生一个异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就由用户态转到了内核态。3.外围设备的中断,当外围设备完成用户请求的操作后,比如硬盘读写操作,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。本文参考《Linux内核设计与实现》以及文章http://wenku.baidu.com/view/eedf2f265901020207409c25.html与http://www.cnblogs.com/f8915345/p/3154526.html穿别人的鞋,走自己的路,让别追去吧

浅析Linux操作系统是如何工作的

相关文章:

你感兴趣的文章:

标签云: