[原创]FreeBSD6.0中调度机制[长]

2009-05-13 02:37:47来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

                       FreeBSD6.0中cpu_switch调度机制分析
writtent by: gvim @ chinaunix /bsd
release under BSD license

在这一系列的小文里,我将从我自己的学习分析入手,尽量为大家展示一张清晰的进程相关机制与实现。后面的小文初步计划包括中断,时钟,系统调用框架,KSE,调度策略,等等有关进程的部分。有些部分已经有朋友实现了分析说明,我会在他们分析的基础上添加,修改,更新,使得这些东西可以形成一张体系网络。我不是专职作家或教育家,所以时间可能会比较长。当然,我不是神仙,我也会犯错。

作为开篇,我先详细分析调度机制。操作系统的心脏是调度器,并且这个心跳的脉搏是时钟。调度可以分为两个部分,一部分属于平台无关的调度策略,策略在[2]、[3]、[4]中已经有十分详尽的介绍;另一部分属于平台相关的调度机制,也就是本篇小文偏向的重点。时钟将在以后的小文中予以介绍(这部分[2]写得十分简略)。

既然调度机制是平台相关的,那为什么还需要分析它?我个人认为,首先自低向上的分析也是一种学习方式;只学习调度策略而不分析调度机制,对于调度器这个行为体来讲,是不完整的;另外,调度机制是与计算机体系紧密结合的,是软硬件之间交互的方式之一;最后,知道了实际的调度机制之后,我们可以在上层替换/修改调度策略,实现我们自己的调度器。分析的代码忽略SMP的相关内容,一些剖析(profiling)内容和其他与调度切换本身关系不大的相关代码(从前面的行号可以看出来省略部分,需要完整的话可以在下面的链接找到)。下面的代码都摘自
http://fxr.watson.org/fxr/source/i386/i386/swtch.s?v=RELENG60
,因此保留行符便于查对。如果对汇编不熟悉的话,跳过相应代码而直接看解释应该没有太大问题。

本文的写法与[6]的任务切换部分的详细扩展。[6]中其余部分可以参见风雨兄的翻译
【进程管理】之【FreeBSD内核如何在保护模式下管理IA32处理器(译)】
感谢雨丝风片@chinaunix/bsd和congli@chinaunix/bsd的审查、鼓励与支持 J

首先找到调度器调度机制的代码入口,该入口如下,在i386/i386/swtch.s中。
95
ENTRY(cpu_switch)
宏ENTRY在i386/include/asm.h中定义如下:

#define ENTRY(x) _ENTRY(x)

在相同的文件中我们可以看到如下的定义:

#define CNAME(csym)  csym
#define _START_ENTRY .text; .p2align 2,0x90
#define _ENTRY(x) _START_ENTRY; \
.globl CNAME(x); .type CNAME(x),@function; CNAME(x):

这样ENTRY(cpu_switch)可以做如下替换

.text; .p2align 2,0x90; \

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:NetBSD上电启动到内核运行之前流程的简单介绍

下一篇:jsp+javascrip 动态构造树