基于Linux-3.9.4的mykernel实验环境的极简内核分析
382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
一、实验环境
win10 -> VMware -> Ubuntu16.04 -> QEMU -> linux-3.9.4
二、实验目的
1、了解在一个极简内核中,为了实现多进程的切换,需要哪些必要的数据结构;
2、了解对于一个OS来说,进程是如何启动以及如何基于时间片轮转对进程进行切换。
三、实验结果

图 1 实验结果
四、代码分析
(1) 对应的PCB(进程控制块)
为了能够实现进程的切换和正常运行,对于每一个进程,都需要有一些必要的资源、参数。比如,对应进程的唯一标识(pid)、进程的状态(state)、每一个进程对应的堆栈(stack)、进程的入口地址(entry)、指向进程队列中位于当前进程的下一进程指针(pnext)等等。

图 2 PCB结构体定义

图 3 进程切换的大致流程图
(2)进程切换的逻辑分析
具体来讲,对于进程的上下文切换,需要在平常的C代码之间嵌入一些必要的汇编代码,以保存将要被替换的进程的相关信息(现场)以及执行下一的进程,对于新的进程,也并非是从头开始执行(第一次执行除外),而是从上一次被中断的地方继续开始执行。

图 4 进程切换中实现进程间上下文切换的汇编代码
(3)极简内核的整体流程分析

图 5 极简内核整体运行流程图
在个人看来,该极简内核的运行在本质上是一个死循环,在这个死循环中,基于固定时间片轮转思想,修改进程切换标志,在该死循环中查询进程切换标志,如果符合要求,则进行进程的切换,否则继续执行当前进程,不进行进程切换。当然,这个死循环,是由内核中的0号进程触发。0号进程是内核启动起来,经过相应的初始化之后,执行的第一个进程。

图 6 my_start_kernel中对0号进程的初始化
· 
图 7 my_start_kernel中对进程链表的初始化(包括PCB初始化)

图 8 my_start_kernel中执行的第一个进程(0号进程)

图 9 时间片的实现(系统时钟中断

图 10 0号进程死循环查询是否执行进程切换
四、总结
通过分析实验代码,比较清楚地了解一个简单的时间片轮转多道操作系统内核,了解了操作系统的中断上下文和进程上下文切换。对于当前执行的进程来说,如果被分配到的时间片执行完,CPU 则会进行相应的进程切换。其中的调度程序,就是在维护一个就绪进程队列,当进程用完属于它的时间片后,在队列中就会按照优先级重新排序。这种调度方式,应该是属于一种比较简单、公平同时也是比较高效的方式。
基于Linux-3.9.4的mykernel实验环境的极简内核分析的更多相关文章
- 基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)
一个极简的Web图床应用,支持复制粘贴与拖拽上传图片 1.开发缘由 日常使用Vs Code编写markdown笔记与博客文章时,在文章中插入图片时发现非常不便 使用本地文件编写相对路径---没法直接复 ...
- [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建
本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...
- Linux内核分析——第八周学习笔记20135308
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...
- 《Linux内核分析》第八周学习总结
<Linux内核分析>第八周学习总结 ——进程的切换和系统的一般执行过程 姓名:王玮怡 学号:20135116 ...
- Linux内核分析 笔记八 进程的切换和系统的一般执行过程 ——by王玥
一.进程切换的关键代码switch_to的分析 (一)进程调度与进程调度的时机分析 1.不同类型的进程有不同的调度需求 第一种分类: I/O-bound:频繁地进行I/O,花费很多的时间等待I/O操作 ...
- Nginx配置多个基于域名的虚拟主机+实验环境搭建+测试
标签:Linux 域名 Nginx 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xpleaf.blog.51cto.com/9 ...
- 【MOOC EXP】Linux内核分析实验八报告
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的切换和系统的一般执行过程 知识点 ...
- “Linux内核分析”实验二报告
张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.第二周学习内 ...
- 【MOOC EXP】Linux内核分析实验二报告
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [操作系统是如何工作的] 教学内 ...
随机推荐
- HFun.快速开发平台(一)=》简述
[——使用成熟的技术实现了解的业务,关注面向对象,关注业务领域] 偶然的机会又回到了园子,看到上次的文章已是N年前,洽巧近期正在开发一个小程序,标题定为“快速开发平台”有点夸张,算是给自己定个小目标. ...
- java-js知识库之二——canvas绘制炫彩气泡
现在使用canvas绘制气泡,虽说很多人都已经实现过了,可能方法都大同小异,但自己写和看别人写完全是两码事,自己会写的才是自己的,话不多说,直接上代码. 先来一张效果图: 现在上代码,代码有详细的注释 ...
- python 在内网windows环境下pip三方包
我没用过Linux环境. 一般情况下,内网安装三方包,只需要在pypi找到对应python版本(2.7,3.6,...),系统位数(32位,64位)的whl包,cmd命令行cd进入相关目录,pip i ...
- 浅析构造函数,及public、private、protected、final、this、super关键字
初学JAVA,感觉很多知识点不熟悉,看了好多遍教材,最终还是决定把它写下来,加深印象以便忘了的时候再过来复习一下.看上去字数可能比较多,其实内容很简明. 首先看this的用法: package tes ...
- Tensorflow实战系列之三:
博主也是初学,能力有限,这个完全没想好..
- mongo的runCommand与集合操作函数的关系
除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0 ...
- 关于“load”方法
load是一个方法,在程序文件中,只有ruby遇到它的时候才会执行.Ruby不会搜索整个文件去执行load命令.也就是说,当Ruby解释器遇到它的时候,它才会去寻找它要加载的文件.这意味着需要加载的文 ...
- 利用postman 实现Get和Post测试
通过之前对金字塔结构的学习,大概了解到了金字塔模型想告诉我们的几个道理: 1.越底层,越稳定. 金字塔主要观点认为单元测试的稳定性高,需要多投入. 2.越底层,越高效. 程序的问题,最终还得落在具体的 ...
- SQL Server DDL
1:向表中添加字段 Alter table [表名] add [列名] 类型 2: 删除字段 Alter table [表名] drop column [列名] 3: 修改表中字段类型 (可以修 ...
- Map、Set、List区别
转:https://www.cnblogs.com/jing99/p/6947549.html 提到集合之前,先说说数组Array和集合的区别: (1)数组是大小固定的,并且同一个数组只能存放类型 ...