实验五:Linux操作系统是如何工作的?

学号:SA1****369

操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制

首先要整明白的一个问题是什么是存储程序计算机?其实存储程序计算机正是冯.诺依曼最初提出的计算机体系模型,现在我们一提到冯.诺依曼体系结构首先会想到的应该是包含输入设备、输出设备、存储器、控制器、运算器组成的经典模型,但是这里我们强调的存储程序计算机的主要特征实际上并非如此,存储程序计算机的概念相当于是褪去现代计算机华丽的外衣,所呈现出来的实实在在的计算机的本质。主要由处理器和存储器组成,中间以总线相连。

CPU通过总线从存储器中读取指令和数据进行处理,采用的主要机制是函数调用推栈机制。在不发生中断、异常以及系统调用的过程中,每个进程的执行都符合函数调用堆栈机制。

接下来说说堆栈机制。具体的函数调用堆栈机制,在我之前的博文中已经详细阐述,具体见实验一 计算机是怎样工作的 SA*****369 张*铭 。

PS:另外也可参阅C函数调用机制(x86的linux环境下)

中断机制是现代操作系统的特征所在,即这是区分操作系统是否为现代操作系统的一个重要依据,也是现代操作系统能够实现多任务的一个重要因素。我们可以将硬件中断(即外围设备产生的中断)与软中断(即系统调用)共同称为中断。CPU在运行一个进程的过程中,接受到一个中断信号,则CPU会停下正在执行的任务,转而去处理相应的中断服务例程。每个不同的中断都对应着一个相应的中断服务处理程序。

简述操作系统(内核)是如何工作

参考材料:

Linux操作系统学习_用户态与内核态之切换过程

分析进程切换宏 switch_to

linux2.6.29 swtich_to 详细分析

在我的上一篇博文Linux操作系统学习_用户态与内核态之切换过程中,我已经详细介绍了Linux操作系统中为什么要分为用户态和内核态两种状态,以及用户态和内核态的区别。同时也从虚拟地址空间的角度阐述了内核空间与用户空间的概念,更是由此引出了内核栈与用户栈的概念及区别。在操作系统工作的过程中,大多数时间都是运行在用户态下。只有当用户态下的程序发生了系统调用,或者当进程在用户态下执行时发生了硬件中断,再或者当进程执行在用户态下时,发生了异常,这些情况下,系统都会发生用户态和内核态之间的切换,即由用户态切换到内核态。

下面简要的叙述一下操作系统的工作机制。首先一个进程,这里我们假设为A,运行在用户态下,此时产生了中断,这时需要调用操作系统内核态下的中断处理函数来对中断进行处理,因此,这时就会发生用户态和内核态之间的切换,将进程由运行于用户态切换到运行于内核态。具体详细的过程,前一篇博文中已经介绍了。在这一过程中,首先将esp寄存器的值指向内核空间的内核栈,将eip寄存器指向中断处理程序的入口地址,即中断处理程序的第一条指令。然后,将进程A用户态下的用户栈的esp值和eip值入栈。(可能有人会在这里产生疑惑,esp和eip的值都已经改变了,怎么还要将用户态下的值入栈呢?另外一个疑问就是,你怎么知道是压入到内核栈。对于第一个问题,关键在于TSS,虽然在之前将esp和eip的值都改变了,但是TSS中仍保存着用户态下的各个寄存器的信息,因此,将TSS中的esp和eip的信息入栈,即是将用户态下的用户栈的信息入栈,实际上是对进程前一状态进行保存,以便中断返回后可以继续正确的执行之前正在执行的任务。第二个问题其实很简单,因为第一步中已经将esp指向了内核栈的栈顶,而我们知道,每次由用户态切换到内核态时,内核栈都是空的,因此内核栈的栈顶和栈底实际上是一个地址,因此我们可以确定是压入到了内核栈)。然后将之前在用户态运行的应用程序的eflags,cs等寄存器的内容压入到内核栈中。然后调用SAVE_ALL宏来将其他所有的寄存器信息入栈保存。由于此时cs、eip已经指向了中断处理程序,因此,开始执行中断处理程序,对中断进行处理。当中断处理程序执行完毕后,会判断是否需要进行进程调度,若是需要,则调用schedule函数,然后在schedule中会调用switch_to宏,在switch_to宏中又会调用_switch_to函数来进行进程调度。具体的switch_to函数的原理,见上面的参考资料。

当进程需要从内核态返回到用户态时,主要是对前面所进行过的所有改变的一种恢复,首先调用restore_all来将eax、ebx等寄存器保存于内核栈中的值出栈,然后调用iret来恢复其他寄存器的状态,可以看出,iret是与SAVE_ALL相反的过程。总体来说,restore_all和iret都是在恢复之前由用户态切换到内核态时,各个寄存器的状态的变化。到此,我们的系统又由运行于内核态切换到了用户态。

Linux操作系统学习_操作系统是如何工作的的更多相关文章

  1. Linux操作系统学习_用户态与内核态之切换过程

    因为操作系统的很多操作会消耗系统的物理资源,例如创建一个新进程时,要做很多底层的细致工作,如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录.页表等,这些操作显然不能随便让任何程序都可以做,于是就产 ...

  2. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  3. 别出心裁的Linux命令学习法

    别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...

  4. 别出心裁的Linux系统调用学习法

    别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...

  5. LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第二周学习总结——操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  6. Linux第二周学习总结——操作系统是如何工作的

    第二周学习总结--操作系统是如何工作的 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  7. 《Linux内核分析》第二周学习小结 操作系统是如何工作的?

    郝智宇   无转载   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈: 1.计算机是 ...

  8. Linux学习路线全解,Linux操作系统学习路线

    大家都知道,在现在这个信息化飞速发展的时代,IT技术火速发展,信息的重要性,可想而知.现在,在北京当一个高级运维工程师,年薪百万已经不是梦想.当然我也想,谁不想挣大钱,开好车,住好房.下面说说自己的一 ...

  9. 《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径

    前言:学习的课程来自极客时间的专栏<趣谈 Linux 操作系统>,作者用形象化的比喻和丰富的图片让课程变得比较易懂,为了避免知识看过就忘,打算通过写学习笔记的形式记录自己的学习过程. Li ...

随机推荐

  1. dedeCMS中单独调用子栏目模板和子栏目的文章时修改源代码给channel和chanenartllist加上limit

    在网站文件中找到include-taglib-chanel.lib.php,和chaneartllist.lib.php 下载用php的IDE打开, chanel.php加入limit属性修改如下 & ...

  2. JAVA Static方法与单例模式的理解

    近期用sonar測评代码质量的时候,发现一个问题,project中一些util类,曾经写的static方法都提示最好用单例的方式进行改正. 为此,我细致想了想,发现还是非常有道理的.这里谈谈我个人对s ...

  3. 错 &#39;Cannot run program &quot;/home/uv/IDE/adt/sdk/platform-tools/adb&quot;: error=2, No such file or directory

    为linux平台搭建android开发环境的人,您可能会遇到问题,如下面有: 64位置linux安装64位置eclipse和64位置jdk开场后eclipse错误后 ""Canno ...

  4. ArcGIS课程:表面数据转换成矢量数据

    虽然TIN (TIN) 和 terrain 数据收集被认为是载体表面.但它们实际上包括基于其他信息元素.并且该信息是在图象点.线或多边形原始格这可能是更实用的公式.在 ArcGIS 在,你可以很容易的 ...

  5. Windows 8 常用第三方SDK使用概览

    原文:Windows 8 常用第三方SDK使用概览 应用开发过程中,我们或多或少会使用到第三方的公司平台的功能,例如:新浪微博.人人网.高德地图等. 那么在Windows 8 Store App开发中 ...

  6. Session变量不能转移到下页.解决: session.use_trans_sid = 1

    附:文摘 ============================================================ 在PHP使用SESSION的朋友可能会碰到这么一个问题.SESSIO ...

  7. 图文解说PhpStorm 7.0版本新增内置工具

    很多PHP开发者,都比较关心PhpStorm 7.0版本的内置工具.今天我们将测试内置的Vagrant工具和SSH远端控制台工具. Vagrant工具集成在PhpStorm 7.0版本中,提高了IDE ...

  8. 学习PHP时的一些总结(四)

    目录的基本操作: 在系统的每个目录下都有两个特殊的目录"."和".." , 分别指示当前目录和当前目录的父目录. dirname()  返回目录的名称 path ...

  9. 造出最好的 CMS 轮子

    zerojs! 造出最好的 CMS 轮子 zerojs是一个基于nodejs.angularjs.git的CMS.在它之上可以继续开发出博客.论坛.wiki等类似的内容管理型系统. 拥抱开发者和社区 ...

  10. Linq to NHibernate入门示例

    Linq to NHibernate入门示例 NHibernate相关: 09-08-25连贯NHibernate正式发布1.0候选版 09-08-17NHibernate中一对一关联的延迟加载 09 ...