zoukankan      html  css  js  c++  java
  • 实验五:Linux操作系统是如何工作的?破解操作系统的奥秘

    SA*****160     *丰  

    实验内容:

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

    2.在操作系统工作的基础之上,请您简述操作系统(内核)是如何工作,宏观概述结合关键点的

       微观(CS:EIP、EBP/ESP等的变化)分析。

    3.完成500字左右的一段总结文字(务必是自己写的),附上学习研究笔记,另外请大家养成尊

       重知识产权的习惯引用或参考别人的资料注明出处URL。

    4.实验报告以博客URL方式提交

    5.请于本周四实验课前提交,最迟提交日期6月30日24:00.

    实验过程:

    1.存储程序计算机、堆栈(函数调用堆栈)机制和中断机制

    1.1存储程序计算机

    存储程序计算机最早是由著名数学家冯·诺伊曼等人在1946年结并明确提出来的,因此又被称为冯·诺伊曼计算机。

    存储程序计算机在体系结构上主要特点有:

    a.以运算单元为中心

    b.采用存储程序原理

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

    d.控制流由指令流产生

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

    f.数据以二进制编码

     

    操作系统其实就是一个死循环,CPU一直在执行这个循环,CS:EIP指向下一条要执行的指令。

    1.2堆栈(函数调用堆栈)机制

    内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会有两个栈,

    一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指

    针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的

    内容是内核栈空间地址,使用内核栈。

    具体请参考我的另一篇博文:计算机是怎样工作的

    1.3中断机制

    中断是CPU的一个功能,就是CPU停下当前的工作,转到中断信号指向的特定工作,同时CPU的控制权发生变化。

    存储程序计算机通过函数调用堆栈来工作,而中断的出现使多线程成为可能。中断分为:I/O中断、时钟中断、系

    统调用。

     

    中断产生后,由用户态转到内核态,由用户堆栈切换到内核堆栈。

    具体请参考我的另一篇博文:中断、异常和系统调用的关系

    2.操作系统(内核)是如何工作,宏观概述结合关键点的微观(CS:EIP、EBP/ESP等的变化)分析

    2.1内核是由什么组成的

    a.内核线程(进程)--> 软中断、tasklet、工作队列

    b.系统调用(中断处理程序)

    c.中断处理程序(内核执行的控制路径,eg:I/O中断和时钟中断)

    其中b和c是内核的控制路径;CPU和内核都是所有进程共享的。

    2.2内核工作过程分析

    2.2.1下边以时钟中断为例,讲述操作系统内核的工作过程,如下图所示:

     

    单核CPU计算机工作其实是串行的,即每时刻只能执行一个程序,如果我们要“同时”执行多个程序,就要一种机制来切换程序(进程),

    使每个进程都能占用CPU,这种机制就是中断和进程调度。

    while(1)

    {

            执行指令;

            修改CS:IP使其指向下一条将要执行的指令;

    }

    操作系统内核就是个死循环,等着被中断。如果没有任务时就执行系统设定好的进程。

    1.如果现在一个进程A处于运行状态,esp指向A用户栈,eip指向进程A的下一条将要执行的指令;

    2.此时发生时钟中断,CPU找到中断处理总程序的入口处(此地址由CPU厂商指定,而中断处理总程

       序由操作系统厂商编写;此过程修改esp使其指向内核栈,修改eip指向中断处理总程序入口处);

    3.陷入内核态,保存原来的esp、eip等相关信息到内核栈(需要借助记录CPU状态的TSS)save_all保护现场(也是保存到内核的堆栈);

    4.处理中断子程序(进程调度),此过程由于进程调度,切换将要执行进程B的内核栈;

    5.restore_all恢复现场,恢复esp的值,使其切换到用户栈;同时iret恢复cs:eip,切换到用户态,执行B程序

    关于save_all、restore_all和iret请参考我的另一篇博文:中断处理中的save_all、restore_all和iret

    2.2.2以系统调用为例分析内核工作过程

    fork和exec系统调用最终都是通过int 0x80软中断 + EAX寄存器(存储对应的系统调用号)进入内核,在内核中fork和exec对应找到

    sys_fork/do_fork和sys_exec/do_exec。do_fork主要的工作就是创建一个新进程,创建的方法是拷贝当前进程、分配新的进程pid、

    插入进程相关链表队列中等。 do_exec的工作较为复杂,它的主要目标是将一个可执行程序加载到当前进程中来,返回到用户态时EIP

    指向可执行程序的入口位置(即 0x08048000)。

    参考资料:

    维基百科之存储程序计算机

    孟老师:实验二参考答案

  • 相关阅读:
    CodeForces 576E Paingting Edges
    CodeForces 1361D Johnny and James
    agc027_d Modulo Matrix
    agc046_f Forbidden Tournament
    MySQL架构及优化原理
    Ubuntu下无法安装pip
    WSL安装问题----wslregisterdistribution failed with error: 0x8007007b
    基础排序算法总结(一)
    透明代理、匿名代理、混淆代理、高匿代理
    常见“加密”算法之 base64
  • 原文地址:https://www.cnblogs.com/wufengv5/p/3159357.html
Copyright © 2011-2022 走看看