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

  • 【实验五】Linux操作系统是如何工作的?破解操作系统的奥秘
    • 操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制
    • 在操作系统工作的基础之上,请您简述操作系统(内核)是如何工作,宏观概述结合关键点的微观(CS:EIP、EBP/ESP等的变化)分析
    • 完成500字左右的一段总结文字(务必是自己写的),附上学习研究笔记,另外请大家养成尊重知识产权的习惯引用或参考别人的资料注明出处URL
    • 实验报告以博客URL方式提交,提交地址 实验五提交入口
    • 请于本周四实验课前提交,最迟提交日期6月30日24:00
  • 附加实验:写一个自己的OS Kernel(进程管理和进程调度)
    • 实验环境见:https://github.com/mengning/mykernel

 -----------------------------------------------------------------------------------------SA****6352--------------------------------------------------------------------------------------

  1. 操作系统工作基础
    • 存储程序计算机 
      • 存储程序计算机最早是由著名数学家冯·诺伊曼等人在1946年总结并明确提出来的,因此又被称为冯·诺伊曼计算机
      • 存储程序计算机在体系结构上主要特点有:
        1. 以运算单元为中心
        2. 采用存储程序原理
        3. 存储器是按地址访问、线性编址的空间
        4. 控制流由指令流产生
        5. 指令由操作码和地址码组成
        6. 数据以二进制编码
    • 堆栈(函数调用堆栈)机制
      • 以调用函数f(x, y, z);为例
        • 首先:z入栈、y入栈、x入栈
        • 其次:next address 入栈
        • 新过程中:ebp入栈;所以新过程中:0x8%ebp为第一个参数,0xc%ebp为第二个参数,0x10%ebp为参数z
        • 最后:leave与ret;leave相当于movl %ebp, %esp、pop %ebp 

          ret相当于 pop eip,此时恢复状态

    • 中断机制
      • 通俗来说,中断就是“打断”,放下自己正在干的活,转向到别的事情去做。
      • 而“打断机制”就是那些打断我、告诉我要干别的事情的策略
      • 在linux中,CPU执行完一条指令后,下一条指令的逻辑地址存放在cs和eip这对寄存器中。在执行新指令前,控制单元会检查在执行前一条指令的过程中是否有中断或异常发生。如果有,控制单元就会抛下指令,进入下面的流程:
        1. 确定与中断或异常关联的向量i (0~255)
        2. 寻找向量对应的处理程序
        3. 保存当前的“工作现场”,执行中断或异常的处理程序
        4. 处理程序执行完毕后,把控制权交还给控制单元
        5. 控制单元恢复现场,返回继续执行原程序
        6. 整个流程图如下图所示
  2. 操作系统(内核)的工作原理
    • 广义地来说kernel就是一个软件,它在硬件和运行在计算机上的应用程序之间提供了一个层。严格点从计算机科学的角度来说,Linux中的Kernel指的是Linus Torvalds在90年代初期写的那点代码
    • 内核的功能:进程调度、文件系统、存储管理、模块管理、性能调优
    • 其工作也是离不开CS:EIP、EBP/ESP这些寄存器,内核干什么活,都是反反复复修改、恢复这些值。
  3. 个人总结
    • LInux操作系统分析这门课,让我更深入的理解操作系统的更底层的东西。以往本科时学过的操作系统,都是泛泛的学习操作系统以及其内核的所提供的各种功能,例如各种管理。那时操作系统在我眼里是一个“大管理学家”,如果深入理解了操作系统,我们就成为了半个管理学家。
    • 从实验一到实验五,一直是这个问题围绕着我们:”如何工作的?“。
      • 从硬件的宏观角度讲:
        1. CPU:解释计算机指令以及处理计算机软件中的数据
        2. 内存:主存,存储程序和数据
        3. 主板:一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有BIOS芯片、I/O控制芯片、键盘和面板控制开关接口、指示灯插接件、扩充插槽、主板及插卡的直流电源供电接插件等元件
        4. 电源:供电
        5. 硬盘:外存、存储文件
        6. 显卡、声卡、显示器
        7. 下图说明硬件工作流程:
      • 从软件角度讲:
        1. 操作系统:管理电脑硬件与软件资源的程序
      • 整体角度讲”如何工作的?“
        1. 开机后加载BIOS:检查各种硬件起源,之后控制权交给硬盘第一个扇区(MBR)
        2. 读取MBR,即主引导记录
        3. Boot Loader
        4. 加载内核
          1. 读取内核映像,并解压
          2. 把解压后的内核放在内存中,调用非常重要的函数start_kernel(),启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立
            1. 输出内核信息
            2. 执行setup_arch():设置系统结构
            3. 执行sched_init():初始化系统调度机制
            4. 执行parse_early_param()和parsees_args():解析系统启动参数
            5. 执行trap_in itQ:设置系统中断向量表
            6. 执行rcu_init():初始化系统中的Read-Copy Update互斥机制
            7. 执行init_IRQ():初始化外设中断
            8. 执行init_timers()、softirq_init()和time_init():初始系统的定时器机制、软中断机制以及系统日期和时间
            9. 执行mem_init():初始化物理内存页面的page数据结构描述符,完成对物理内存管理机制的创建。
            10. 执行kmem_cache_init():初始化通用slab缓冲区管理机制
            11. 执行fork_init():计算出当前系统的物理内存容量能够允许创建的进程(线程)数量
            12. 执行proc_caches_init() 、bufer_init()、 unnamed_dev_init()、vfs_caches_init()、signals_init()等函数:对各种管理机制建立起专用的slab缓冲区队列
            13. 执行proc_root_init():对虚拟文件系统/proc进行初始化
            14. 执行kenrel_thread():创建出第一个系统内核线程(即1号进程)
        5. 用户层init依据inittab文件来设定运行等级

 

  • 附加实验
    • (待完成)

 

参考链接:

本文链接:

posted @ 2013-06-29 15:16  wkm123  阅读(864)  评论(1编辑  收藏  举报