Linux内核分析2
周子轩原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
本次实验是通过分析一个简单的时间片轮转多道程序内核源代码来理解操作系统的工作原理。
先使用实验楼的虚拟机打开shell。
然后cdmykernel 找到mymain.c和myinterrupt.c两个源代码。


进入https:///mengning/mykernel/blob/master可以找到本次实验需要的几个重要的源代码。然后将上面两个代码修改成网站中找到的代码,除此之外还要加上mypcb.c。
返回之后再次运行,可看到0、1、2、3几个进程相互切换。
下面将对这三个源代码进行详细的分析。
首先是mypcb.h代码:
这个代码的目的是定义一个进程控制块。先定义了一个Thread来存储ip和sp,也就是用于eip和esp的保存。PCB中定义了进程管理相关的数据结构。最后的函数my_schedule表示的是调度器。
接下来是mymain.c代码:
先是includemypcb。声明了一个数组task,然后声明了当前task的一个指针,第20行处定义了一个标志,用来判断是否需要调度。然后定义了一个函数my_process。
my_start_kernel函数中先初始化一个进程0,第32行为定义进程0的入口为my_process,因为一开始系统里只有进程0,所以第34行代码表示的是pid的next还是指向自己。接下来就创建更多其他的进程,在初始化这些进程的时候可以直接把0号进程的代码拷贝过来,第41行表示每个进程都有自己的堆栈,然后把创建好的新进程放到进程列表的尾部,这样就完成了创建。
创建好了之后就可以开始执行0号进程,第48行处到之后的几行代码表示的是一段嵌入式汇编代码。其中的%0表示的是参数thread.ip,%1表示的是参数thread.sp。第49行表示的就是把参数thread.sp放到esp中;接下来push%1,又因为当前栈为空,esp=ebp,所以等价于pushebp;然后pushthread.ip;ret等价于popthread.ip;最后popebp。
ret之后0号进程就正式启动了。
函数my_process定义所有进程的工作。这个函数里面定义了一个循环,if语句表示循环1000万次才有机会判断是否需要调度。这是一个主动调度的机制。
最后是myinterrupt.c的代码:
也是先includemypcb,然后定义了一些全局参数。
接着是一个函数my_timer_handler,用于设置时间片的大小,时间片用完时设置一下调度标志。当时钟中断发生1000次,并且my_need_sched!=1时,把my_need_sched赋为1。因为当进程发现my_need_sched=1时,就会执行my_schedule。
If语句表示task为空,即发生错误时返回。第52行开始介绍my_scheduel的工作,先把当前进程的下一个进程赋给next,当前进程为prev。
第54行表示如果下一个进程的状态是正在执行的话,就运用if语句中的代码表示的方法来切换进程,这些代码为嵌入式汇编代码,与mymain.c代码中的相似。
%0表示prev->thread.sp,%1表示prev->thread.ip,%2表示next->thread.sp,%3表示next->thread.ip。pushebp为保存当前进程的ebp;然后保存当前进程的esp;把下一个进程的sp放到esp中;接下来保存eip,$1表示后面的标号1:的位置;然后把下一个进程的eippush到栈里面。
ret之后下一个进程就开始执行了。这是进程切换的关键代码。
与上一段代码不同的是如果下一个进程为新进程时,就运用else中的这一段代码。首先将这个进程置为运行时状态,将这个进程作为当前正在执行的进程。之后的代码为嵌入式汇编代码,与上文稍微有点不同,但语句都差不多类似,这里就不赘述了。
总结:操作系统的“两把剑”:中断上下文和进程上下文的切换。其中中断上下文也就是保存现场和恢复现场。所以操作系统就是通过不同进程的不断切换来完成工作的。
Linux内核分析2的更多相关文章
- linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...
- Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序
1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...
- linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
- linux内核分析作业5:分析system_call中断处理过程
1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果, ...
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...
- linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码
计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针 (stack pointer) ...
- linux内核分析作业3:跟踪分析Linux内核的启动过程
内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- 《Linux内核分析》期末总结
Linux内核设计期中总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 前八周博客汇总及总结 Linux内核设计第一周——从汇编语言出发理解计算机工作原理 我们学习了汇编语言的基础知识,这一 ...
- 《Linux及安全》期中总结&《Linux内核分析》期终总结
[5216 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK NINE ...
随机推荐
- Javac提示不是内部或外部命令
1.先去百度搜索"jdk下载"下载最新版jdk,并安装,安装目录不用去更改,直接默认就好,下载完了之后,双击打开安装,jdk安装完成后,会接着安装jre包,(jre和jdk是配对的 ...
- 从源码角度彻底理解ReentrantLock(重入锁)
目录 1.前言 2.AbstractQueuedSynchronizer介绍 2.1 AQS是构建同步组件的基础 2.2 AQS的内部结构(ReentrantLock的语境下) 3 非公平模式加锁流程 ...
- 【UGUI】 (一)------- 放大镜
在许多游戏或应用中,我们常常看到放大镜的身影,而在Unity里面,制作一个简易的放大镜是非常简单的. 一. 创建一个3DObject 创建一个Cube或者 Cylinder,这里为了更像放大镜一 ...
- Amazon及其亏本诱饵策略还能坚持多久?
Amazon 刚刚公布了最新的财报,亏损 4100 万美元.这是这家电子商务巨头连续 5 个季度以来的第 3 次亏损.但是华尔街似乎却一片叫好声,当日 Amazon 的股价也涨了近 8 个点达 359 ...
- Hyper-V虚拟机联网设置
转自:http://www.3lian.com/edu/2012/12-22/50492.html Windows 8中内置的Hyper-V管理器可以说给许多人带来了惊喜!在Hyper-V管理器强大的 ...
- Python Pygame(5)绘制基本图形
最近很火一些简单图形构成的小游戏,这里介绍一些绘制图形的函数. 1.绘制矩形 rect(Surface,color,Rect,width=0) 第一个参数指定矩形绘制到哪个Surface对象上 第二个 ...
- CentOS 7 安装 MySql 8
1-安装 CentOS 7 2-安装 NETCORE SDK SDK 安装文档:https://dotnet.microsoft.com/download/linux-package-m ...
- virtual judge 本地部署方案
这是一种将自己的电脑当作服务器来部署一个vj的方法,我也是参考前辈们的做法稍作了改动,如果在服务器上部署的话需要在细节上稍作改动: 一.什么是Virtual Judge? vj的工作原理什么? vj ...
- 0511团队项目2.0--产品product backlog
介绍Scrum之product backlog Scrum的基本概念其实并不复杂,但是想做好并不容易,大家都知道product backlog的重要性,但是我们如何制定和展现它,如何评定优先级,如何进 ...
- XHTML语法规范
<head> <meta charset="utf-8" /> <title>xhtml语法规范</title> </head ...