• 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的


    一、计算机是如何工作的——总结

    三个法宝

    存储程序计算机、函数调用堆栈、中断机制
    

    二、堆栈

    1.是c语言程序运行时必须的一个记录调用路径和参数的空间。

    函数调用框架、传递参数、保存返回地址、提供局部变量空间
    

    2.相关寄存器

    esp 堆栈指针
    ebp 基址指针(记录当前函数调用基址)
    

    3.操作

    push 栈顶地址减少4个字节
    pop 栈顶地址增加4个字节
    

    4.其他寄存器

    cs:eip	总是指向下一条的指令地址
    -顺序:总是指向地址连续的下一条的指令地址;
    -跳转/分支:根据程序需要被修改;
    	call:将当前cs:eip值压栈,cs:eip指向被调函数入口地址。
    	ret:从栈顶弹出原来保存在此的cs:eip值,放入cs:eip中。
    

    5.参数传递与局部变量

    举例分析

    6.函数调用(两级、三级)

    三、C代码中嵌入汇编代码

    1.内嵌汇编语法

    2.举例分析

    四、实验及分析(mykernel)

    执行

    mymain.c

    (分析:开始启动操作系统;1.【89行】每循环十万次打印一次mykernel(可以修改循环次数))

    myinterrupt.c

    (分析:每次时钟中断都调用一次printk并输出)

    五、进程分析

    在mykernel基础上构造的简单的操作系统内核

    1.mypcb.h

    • 分析:【14行】定义thread用于存储eip和esp。【20、21、22行】定义pid就是进程的ID;进程状态;内核堆栈。(进程管理相关的数据结构)【25行】程序入口。【26行】用链表连接起来。【29行】调度器。

    2.mymain.c

    内核初始化和0号进程启动



    • 分析:

    【20行】设定是需要调度的标准。

    【30、31、32行】初始化0号进程的数据结构;状态是正在运行;入口是myprocess。

    【33行】堆栈的栈顶。【34行】进程刚启动时指向它自己(只有0号进程在)。

    【35行】创建更多的进程。

    【41行】每个进程都有自己的堆栈。

    【42行】指向下一个进程。

    【43行】将新创建的进程加到进程的尾部,从而建立很多的进程。

    【46行】启动0号进程。

    【48行——56行:汇编代码,内核初始化工作】%1-指55行的sp(可以看做是函数参数,1号参数就是指thread.sp)。【50行】push了1号参数ebp。【51行】将当前的eip压栈。【52行】ret之后0号进程正式启动。

    (有主动调度机制)
    【64行】循环1000万次判断一次是否需要调度。

    3.myinterrupt.c



    • 分析:

    【22——25行】my_timer_handler 函数会被内核周期性的调用,每调用1000次,就去将全局变量my_need_sched的值修改为1,通知正在执行的进程执行调度程序my_schedule。【22行】可以将时间片改小如:100,调度会频繁一点。

    【52行】将当前进程付给下一个。

    【57——71行】两个正在运行的进程之间进行上下文切换。【58】把当前进行的ebp保存起来,【59】把当前进程的esp赋给%0(指的是thread.sp),【60】把%2(指下一个进程的sp)放入esp中,【61】$1f是接下来的标号1:的位置,把eip保存,【62】把下一个进程eip压栈,【63】下一个进程开始执行

    (###操作系统“两剑”:中断上下文、进程上下文的切换。)

    【64行】切换到一个新进程的方法。【66、67行】将该进程置为执行状态,作为当前进程。

    【71-79行:内嵌汇编】【71】保存ebp;【72】保存esp;【73、74】restore ebp;restore esp(此时ebp和esp都指向同一个位置,这个栈是空的);【75】保存eip;【76】把当前进程入口保存起来;

    进程分析总结

    在my_schedule函数中,完成进程的切换。进程的切换分两种。

    1.下一个进程没有被调度过。
    2.下一个进程被调度过,可以通过下一个进程的state知道其状态。
    

    进程切换通过内联汇编代码实现,需要保存之前的进程的eip和堆栈,然后将新进程的eip和堆栈的值存入相对应的寄存器中。

    六、学习总结

    通过本周学习,主要掌握了函数调用堆栈、进程上下文切换方法,学习过程中孟老师通过举例分析使得知识更加容易掌握,(比如,分析参数传递与局部变量的案例,清楚的学习栈的变化,指针的变化情况,这样对上一周堆栈变化知识是一次巩固复习,同时也是对这一周参数传递引起的堆栈变化的内容的学习)。

  • 相关阅读:
    关于extern对变量的使用
    MediaPipe Android Archive
    MediaPipe框架结构
    bazel构建C++工程
    Ubuntu安装ss(终端+浏览器)
    Ubuntu下MediaPipe的环境配置
    Ubuntu使用frp进行内网穿透
    Ubuntu中ssh-server的安装与开机自启动
    Ubuntu系统挂载新硬盘的方法
    Ubuntu16.04下安装TensorFlow
  • 原文地址:https://www.cnblogs.com/zzzz5/p/5232145.html
Copyright © 2020-2023  润新知