(1)系统模型
   在大多数多用户的OS中,用户程序和系统程序是分开的---系统程序是一个比较高的优先级上运行(核心态),而用户程序是在一个较低的等级上运行。系统程序有对系统数据和硬件的操作权,而用户程序要想操作系统数据或者硬件就只能通过系统程序。系统程序在windows2000中是以服务的形式给出。当一个用户程序要访问系统数据时,通过向相应的服务发出请求而实现,而此时CPU通过一个陷阱来陷入到核心态来运行。当所要求的服务完成返回时,windows2000负责恢复用户线程(windows2000中,CPU是以线程为单位来进行调度的)的寄存器状态等,从而使得用户线程得以继续运行。windows2000中,内核和设备驱动都是运行在核心态,它们使用同一段内存空间,这意味着属于某个组成部分的数据有可能被其它的组成部分所修改,有潜在的风险!各个组成部分之间又是可以相互协作的,为了完成一个任务,往往需要这些组成部分之间进行合作。

说明: 在CPU的指令系统中,有些指令是非常危险的,比如说 清内存,设置时钟(是Cpu的时钟,不是日期)等,所以指令分为特权级指令和非特权级指令。对于特权级的指令,只允许操作系统相关的模块使用,用户应用程序只能使用非特权指令。Inter的CPU分为四个特权级别: ring0, ring1, ring2, ring3, 虽然Inter是这样设计的,但是现在的OS基本上都没有全部使用这些特权级别,在Windows中,只使用了ring0 和ring3 这两个特权级,windows的内核运行在ring0上,用户程序运行在ring3上。如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。

 

(2)可移植性
  windows2000被设计成能在多种硬件平台上运行,我们可能会感到很奇怪,它是怎么实现其移植性的呢?我们知道每个平台上的指令系统都不同,所以,不同平台上的代码肯定是不一样的,所以实现移植性的手段也不是很神秘的,主要是以下两点:
     1,windows2000是分层次的,底层部分是平台相关的,而上层部分是平台无关的。也就是说对于每个硬件平台底层部分都要有一个实现,而底层对上层的接口是统一的,所以上层就不用关心底层到底是怎么样实现的,它关心的就是他们之间的接口。 在windows2000中,实现可移植性的两个重要部分是内核(kenel)和硬件抽象层(HAL),这两个部分我们以后会详细说
     2,windows2000的大部分是用C写的,也有一部分是用C++写的,汇编语言只用在直接跟硬件打交道的地方和对性能要求教高的地方。