进入内核后,当然不能无所事事。先创建三个进程,分别打印 A,B,C。虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之。

进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStack 结构,代码如下:

typedef struct {
u32 gs;
u32 fs;
u32 es;
u32 ds;
u32 edi;
u32 esi;
u32 ebp;
u32 KernelEsp;
u32 ebx;
u32 edx;
u32 ecx;
u32 eax;
u32 RetAddr;
u32 eip;
u32 cs;
u32 eflags;
u32 esp;
u32 ss;
} ProcessStack;

稍加注意,会发现有个 KernelEsp。它的作用,是防止进程切换时,栈指针乱指。

进程切换,当然离不开中断。有意思的是,涉及中断调用的任务状态栈 TSS 同 ProcessStack 竟有异曲同工之妙。

进程切换,还有一个关键,就是不能再用简单的 ret 来返回了。kernel.s 中的 save 代码如下:

save:
pushad
push ds
push es
push fs
push gs mov dx, ss
mov ds, dx
mov es, dx mov esi, esp
inc dword [g_IntReenter]
cmp dword [g_IntReenter],
jne .
mov esp, StackTop
push Restart
jmp [esi + P_RetAddr - P_StackBase]
.:
push reenter
jmp [esi + P_RetAddr - P_StackBase] Restart:
mov esp, [g_pProcReady]
lldt [esp + P_LdtSel]
lea esi, [esp + P_StackTop]
mov dword [g_Tss + TSS_ESP0], esi
reenter:
dec dword [g_IntReenter] pop gs
pop fs
pop es
pop ds
popad
add esp,
iretd

其中的 jmp  [esi + P_RetAddr - P_StackBase] ,就是跳到事先保存的返回地址。而这一返回地址,由 main.c 中的 KernelMain 设置。即 for 循环里的 pProc->Regs.esp = (u32)pTaskStack; 这种多兵种作战,需细心体会,方能领会之。

此关键点如能领会,进程切换就不是难事。所谓进程,不过在 ProcessStack 的基础上,添加一些进程 Id,name,优先级而已。

进入工程目录,make 后,再 bochs,即可看到如下界面:

其中,优先级的设置为 15:5:3, 同显示的基本一致。完整代码,可到 x01.Lab.Download 中下载。虚拟机及开发工具,可参看 x01.os.7

有个问题需说明一下。就是修改后重新 make 时,会出现 /mnt/temp 忙,可运行命令 sudo umount /mnt/temp 卸载之。

x01.os.9: 进程切换的更多相关文章

  1. x01.os.13: 文件系统

    停了两天电,忽然得空闲.找来破吉他,已然不成弦.           丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...

  2. Python::OS 模块 -- 进程管理

    os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...

  3. 【原创】(三)Linux进程调度器-进程切换

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  4. linux0.11改进之四 基于内核栈的进程切换

    这是学习哈工大李治军在mooc课操作系统时做的实验记录.原实验报告在实验楼上.现转移到这里.备以后整理之用. 完整的实验代码见:实验楼代码 一.tss方式的进程切换 Linux0.11中默认使用的是硬 ...

  5. Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程

    20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...

  6. Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程

    一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进 ...

  7. x01.os.14: 时间都去哪儿了

    时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...

  8. x01.os.8: 加载内核

    在 x01.os.7 中,借助 freedos,学习了保护模式.但操作系统必须完成引导:boot, 加载内核:loader,kernel,进而管理process,memory,file等. 引导比较简 ...

  9. x01.os.7: 傻子一样的等

    傻子一样的等 昨日出差,办完事后,下午 2:30,准备进长途汽车站买票回家,被一人拦住,说可以带我进去,车马上就要开了,买票来不及.我以为是汽车司机,就跟了进去.进去后,他打了个电话,说 3:30 车 ...

随机推荐

  1. javascript--Function

    概述 函数的声明 (1)function命令 函数就是使用function命令命名的代码区块,便于反复调用. function print(){ // ... } 上面的代码命名了一个print函数, ...

  2. 设置placeholder字体颜色

    /*设置placeholder字体颜色*/::-webkit-input-placeholder{ color: #FFF;}:-ms-input-placeholder{ color: #FFF;} ...

  3. Android总结篇系列:Android Intent

    Intent在Android中的重要性不言而喻.本文主要总结下Intent使用过程中需要注意的一些问题. 1.隐式Intent AndroidManifest.xml声明时<intent-fil ...

  4. [小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)

    在使用xUnit.Net Framework构建单元测试或自动化测试项目的时候,无论是针对一些比较耗费资源的对象亦或是为了支持Test case预设数据的能力,我们都需要有一些初始化或是清理相关的动作 ...

  5. ArcGIS Server 开发之鹰眼地图的实现

    鹰眼简单点说就是地图的联动,鹰眼的全称是OverviewMap,在ERSI提供的API包中,在dijit中进行类的调用.查了很多的资料,总结一下: 具体的代码: <!DOCTYPE html&g ...

  6. CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  7. jQuery Wheel 环形菜单插件5种效果演示

    很酷的菜单-jQuery Wheel 环形菜单插件5种效果演示在线预览 下载地址 实例代码 <div class="container"> <!-- Top Na ...

  8. 类似 Dribbble 下载按钮的 SVG 弹性动画进度条

    Codrops 发布了一个如何创建一个基于弹性效果的 SVG 加载进度条教程,基于 SVG 和 TweenMax 实现.按钮开始的时候是一个带有箭头的图标,一旦它被点击,动画成一个有趣的小金属丝和一个 ...

  9. Eclipse中的Web项目自动部署到Tomcat

    原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写博客,现在感觉还是很有必要的,编程中每个人对于犯过的错误 ...

  10. 定制Eclipse IDE之杂症篇

    上文回顾:定制Eclipse IDE之插件篇(二) 该篇将讲述在开发Eclipse 插件过程发生的疑难杂症.不谈功能,只说病症. 前言.拿哪个Eclipse作为定制的基础? 我建议是你用哪个Eclip ...