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和堆栈的值存入相对应的寄存器中。
六、学习总结
通过本周学习,主要掌握了函数调用堆栈、进程上下文切换方法,学习过程中孟老师通过举例分析使得知识更加容易掌握,(比如,分析参数传递与局部变量的案例,清楚的学习栈的变化,指针的变化情况,这样对上一周堆栈变化知识是一次巩固复习,同时也是对这一周参数传递引起的堆栈变化的内容的学习)。
20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的的更多相关文章
- 20135337朱荟潼 Linux第一周学习总结——计算机是如何工作的
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC-1000029000 1.冯诺依曼体系结 ...
- Linux第二周学习总结——操作系统是如何工作的
第二周学习总结--操作系统是如何工作的 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
- 20135337朱荟潼 Linux第四周学习总结——扒开系统调用的三层皮(上)
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识点梳理 一.用 ...
- LINUX内核分析第二周学习总结——操作系统是如何工作的
LINUX内核分析第二周学习总结——操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...
- 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...
- 20135337朱荟潼 Linux第七周学习总结——可执行程序的装载
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linu ...
- 20135337朱荟潼 Linux第三周学习总结 ——Linux内核源代码简介
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识笔记 1.ar ...
- 《Linux内核分析》第二周学习小结 操作系统是如何工作的?
郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈: 1.计算机是 ...
随机推荐
- 阿里八八Alpha阶段Scrum(7/12)
今日进度 叶文滔: Andriod Studio新版打开旧版项目存在兼容性问题,仍在寻求解决办法 王国超: 今天还是在调bug,真机运行总是闪退 俞鋆: 正在学习api制作和相关的文档编写,研究了一些 ...
- PyQt5--QFontDiaglog
# -*- coding:utf-8 -*- ''' Created on Sep 17, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...
- 【转】Python操作MongoDB数据库
前言 MongoDB GUI 工具 PyMongo(同步) Motor(异步) 后记 前言 最近这几天准备介绍一下 Python 与三大数据库的使用,这是第一篇,首先来介绍 MongoDB 吧,,走起 ...
- Spring IOC 之 SmartInitializingSingleton
使用 实现该接口后,当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法 afterSingletonsInstantiated. 主要应用场合就是在所有单例 bean 创建完成之后,可以 ...
- 天地图api地址
天地图地址 http://lbs.tianditu.com/api-new/examples.html 参考资料 http://lbs.tianditu.com/api-new/class.html
- Python各类并发模版
以后在写一些Python并发的时候参考下面这个模块,小西总结的挺全的,直接搬砖了. 进程并发 from multiprocessing import Pool, Manager def func(d, ...
- Linux下安装与配置snmp服务
一.安装snmp服务 1.检查系统是否已经安装snmp的rpm包 以下是安装snmp服务需要的rpm包: libsensors3-2.10.6-55.el5.i386.rpm lm_sensors-2 ...
- VC++定义全局变量及extern用法
基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern有两 ...
- OpenCV——颜色缩减、计时函数、访问像素
//颜色空间缩减 //src:源图片 //dst:目标图片 //divideWith:缩减宽度 void ColorSpaceReduction(Mat src,int divideWith,Mat& ...
- ssh推送.py程序到服务器端运行
C:\Users\jiangshan>ssh jiangshan@192.168.1.191jiangshan@192.168.1.191's password:Last login: Sun ...