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

三个法宝

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

二、堆栈

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和堆栈的值存入相对应的寄存器中。

六、学习总结

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

20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的的更多相关文章

  1. 20135337朱荟潼 Linux第一周学习总结——计算机是如何工作的

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC-1000029000 1.冯诺依曼体系结 ...

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

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

  3. 20135337朱荟潼 Linux第四周学习总结——扒开系统调用的三层皮(上)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识点梳理 一.用 ...

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

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

  5. 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...

  6. 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...

  7. 20135337朱荟潼 Linux第七周学习总结——可执行程序的装载

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linu ...

  8. 20135337朱荟潼 Linux第三周学习总结 ——Linux内核源代码简介

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识笔记 1.ar ...

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

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

随机推荐

  1. 第二次项目冲刺(Beta版本)2017/12/8

    一.任务分布 二.燃尽图 三.站立式会议 1.照片(就要传了) 2.任务安排 四.总结 这次吸收了上次的教训,将任务进行更加详细的分布,分工更加明确,果然效率就高多了,哈哈哈.

  2. Camstar MES 5.8 發現Ajax事件失效

    從Camstar4.5升級到5.8後,發現原來用戶在4.5下可以正常使用的不良信息收集功能,列出的不良只有第一頁可以顯示,無法自動裝載下一頁. 嘗試發出,IE以下這個選項沒有選中,選中後,就可以正常工 ...

  3. BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)

    Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (| ...

  4. linux 的常用命令---------第二阶段

    vim编辑器 vim 文件名(首先进入命令模式) :(进行编辑文件内容)  → 按 i 键进入插入模式,可以写内容啦. ↓ 按 Esc 键,进入命令模式 ↓ 按 shift + : 键,进入末行模式  ...

  5. jupyter中添加conda环境

    安装完Anaconda利用conda创建了虚拟环境,但是启动jupyter notebook之后却找不到虚拟环境. 实际上是由于在虚拟环境下缺少kernel.json文件,解决方法如下: 首先安装ip ...

  6. css心跳动画

    1.图片无限放大缩小,类似心跳 css如下 @keyframes scaleDraw { /*定义关键帧.scaleDrew关键帧名称*/ 0%{ transform: scale(1); /*开始为 ...

  7. 关于MSCOCO_text数据集的探索

    最近需要做图片中文本识别的项目,然后为了快速验证模型,所以找到了mscoco-text数据集,网站1上是这么说的: 官网是这么说的: 然而,我下下来之后: 1 - 先导入: 2 - 其中key为'im ...

  8. day48

    flex布局 响应式布局 过度 动画 flex布局 学习目的:基于之前所学的盒模型布局(display).浮动布局(float).定位布局(position),都不能很好的解决block垂直居中的问题 ...

  9. 第11章 GPIO输出—使用固件库点亮LED

    第11章     GPIO输出—使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...

  10. CODE[VS] 1159 最大全0子矩阵

    写一道CODEVS的题目 其实我还是很喜欢CODEVS的界面的 主要是系统地学习一下悬线法这个看似十分简单,实际就是十分简单的算法 对于一些详细的东西参考dalao's blog,不喜勿喷 对于悬线法 ...