x01.os.9: 进程切换
进入内核后,当然不能无所事事。先创建三个进程,分别打印 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: 进程切换的更多相关文章
- x01.os.13: 文件系统
停了两天电,忽然得空闲.找来破吉他,已然不成弦. 丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...
- Python::OS 模块 -- 进程管理
os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...
- 【原创】(三)Linux进程调度器-进程切换
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- linux0.11改进之四 基于内核栈的进程切换
这是学习哈工大李治军在mooc课操作系统时做的实验记录.原实验报告在实验楼上.现转移到这里.备以后整理之用. 完整的实验代码见:实验楼代码 一.tss方式的进程切换 Linux0.11中默认使用的是硬 ...
- Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程
20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...
- Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程
一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进 ...
- x01.os.14: 时间都去哪儿了
时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...
- x01.os.8: 加载内核
在 x01.os.7 中,借助 freedos,学习了保护模式.但操作系统必须完成引导:boot, 加载内核:loader,kernel,进而管理process,memory,file等. 引导比较简 ...
- x01.os.7: 傻子一样的等
傻子一样的等 昨日出差,办完事后,下午 2:30,准备进长途汽车站买票回家,被一人拦住,说可以带我进去,车马上就要开了,买票来不及.我以为是汽车司机,就跟了进去.进去后,他打了个电话,说 3:30 车 ...
随机推荐
- redis主从 以及认证配置
以前用redis用的很多,各种数据类型用的飞起,算是用得很溜了.不过那都是封装好的方法,自己直接调用.以前的公司比较规范,开发只是开发,很少去做跟运维相关的事情. 换了一份工作,不过这边项目刚开始起步 ...
- Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...
- One Page Scroll – 实现苹果风格的单页滚动效果
单页滚动网站已经被广泛使用了有一段时间了,它们对于快速提供信息是很有用的.One Page Scroll 是一个 jQuery 插件,简化了创建此类网站的步骤,只需创建 HTML 结构,进行简单设置, ...
- Sass学习之路(5)——变量
1.定义变量:Sass中定义变量的关键字是'$'(毕竟程序员缺钱),并使用冒号(:)进行赋值,例如: $width:200px;//定义了一个名为width的变量,值为200px 2.普通变量和默认变 ...
- ie8不兼容rgba的解决
借鉴................. 在调试ie8兼容性的问题时,发现ie8不支持rgba. 关于rgba(),即为颜色设置的方法函数,rgb代表颜色,a代表透明度. 如rgba(0,0,0,0.1 ...
- 总结CSS3新特性(媒体查询篇)
CSS3的媒体查询是对CSS2媒体类型的扩展,完善; CSS2的媒体类型仅仅定义了一些设备的关键字,CSS3的媒体查询进一步扩展了如width,height,color等具有取值范围的属性; medi ...
- 【Leafletjs】5.L.Control 自定义一个Control
L.Control 所有leaflet控制的基础类.继承自IControl接口. 你可以这样添加控件: control.addTo(map); // the same as map.addContro ...
- Android 手机卫士--构建服务端json、请求网络数据
本文地址:http://www.cnblogs.com/wuyudong/p/5900384.html,转载请注明源地址. 数据的传递 客户端:发送http请求 http://www.oxx.com/ ...
- objective-c系列-NSArray
OC数组NSArray 对比 c数组 和 oc数组对象(指针) 定义 int array[10]; NS ...
- 我的Android六章:Android中SQLite数据库操作
今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...