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

三个法宝

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

二、堆栈

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

六、学习总结

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

转载于:https://www.cnblogs.com/zzzz5/p/5232145.html

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

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

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

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

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

  3. 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程

    第八周 进程的切换和系统的一般执行过程 一.进程切换关键代码switch_to 1.不同类型进程有不同调度需求--两种分类 2.调度策略--规则 Linux中进程优先级是动态的,周期性调整. 3.时机 ...

  4. Linux第二周学习笔记(7)

    Linux第二周学习笔记(7) 2.13 文档查看cat_more_less_head_tail (1). cat命令 cat命令:用于查看一个文件的内容并将其显示在屏幕上 cat-A命令:显示所有的 ...

  5. Linux第二周学习笔记(11)

    Linux第二周学习笔记(11) 2.17 隐藏权限lsattr_chattr chattr命令:是设置吟唱隐藏权限的命令,更改Linux文件系统上的文件属性. 参数说明: A:表示文件或目录的ati ...

  6. Linux第二周学习笔记(5)

    Linux第二周学习笔记(5) 2.11.CP命令 cp(copy简写)命令:用来将一个或多个源文件或者目录复制到指定的目的文件或目录. cp –r:复制目录 -i:安全选项 cp命令:拷贝/etc/ ...

  7. Linux第二周学习笔记(1)

    Linux第二周学习笔记(1) 2.6,相对和绝对路径 (1).路径:就是某一个文件存放的地方,只要键入这个文件的路径系统就只能直接找到这文件所在位置,所以找一个文件需要输入这个文件的路径. (2). ...

  8. Linux第二周学习笔记(12)

    Linux第二周学习笔记(12) 2.18 特殊权限set_uid set_uid:这个权限是针对二进制可执行文件,使文件在执行阶段具有文件所有者的的权限. --------------------- ...

  9. Linux第二周学习笔记(13)

    Linux第二周学习笔记(13) 2.19 特殊权限set_gid 特殊权限set_gid:这个权限可以作用在二进制可执行文件上,还可以作用在目录上.特殊权限set_gid权限位是作用在组权限位上,目 ...

最新文章

  1. 饥荒联机版连不上服务器_饥荒联机版不搜索房间直连服务器教程 搜索不到房间怎么办_游侠网...
  2. Java知识点总结(JavaIO- System类对IO的支持与Scanner类 )
  3. Core Java 第三章 Java基本的程序设计结构
  4. 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 (zz)
  5. deepin执行apt-get update报错https://deb.opera.com/opera-stable stable Release” 没有 Release 文件N: 无法安全地用该
  6. javaee 设计模式_JavaEE重新审视设计模式:装饰器
  7. Linux 后台执行脚本或命令 nohup
  8. layoutSubviews调用
  9. JZOJ 3425. 能量获取
  10. C语言函数声明与定义(待删除)
  11. java 注册表 乱码_修改注册表 消除应用软件的乱码显示
  12. java实验目的_java实验报告一
  13. WIN10 JDK + JCreator
  14. 装饰器模式实现咖啡店(Java代码实例)
  15. 行业专家对2021年的云计算发展趋势的预测
  16. mybatis错误——java.io.IOException Could not find resource comxxxxxxMapper.xml
  17. 高德h5地图api接口_H5,JS中使用微信、高德获取定位
  18. mysql无密码登录
  19. Arena仿真-基于超市排队的建模分析
  20. [CodeForces-1141D] Colored Boots

热门文章

  1. 第7章 Stata相关性分析
  2. 学习笔记:使用requests+Beautiful4爬取优美图库
  3. 日记(2007年7月3日)
  4. Office 文档在线预览解决方案
  5. 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
  6. python可以做机器人吗_零基础如何用Python写一个简单的WeChat机器人?(内附代码)...
  7. 海德汉 LSV2 协议采集 2
  8. 服务器硬件规格常用查看命令——CPU相关命令
  9. 《东周列国志》第六十一回 晋悼公驾楚会萧鱼 孙林父因歌逐献公
  10. LaTex特殊字符和符号