先吹Windows
当Windows发展到Windows 2000时,已经比先前版本的Windows有了质的飞跃。Window 2000在设计上是十分先进的,微软公司随后推出的Windows XP和Windows 2003,其基本架构上都没有太大的变化。在Windows 2000设计之初,微软公司的架构师制定了如下的设计目标。
1.可移植性
可移植性是指只需要少量修改,操作系统即可在尽可能多的硬件平台上运行。Windows必须能运行在多种硬件体系结构上,必须根据市场的需要,相对容易地移植到新的体系结构上。
为了实现移植性,Windows被设计成软件分层的体系结构。和硬件紧密关联的只有硬件抽象层(HAL)。而操作系统的其他重要组件几乎和硬件没有关联性,这就使操作系统的大部分不依赖于特定硬件。当需要将Windows移植到别的平台时,只需要修改相关的硬件抽象层。
为了将Windows移植到更多的硬件上,Windows在设计的时候引入了面向对象编程的思想。操作系统抽象成各个组件,其中只有很少的组件会涉及具体硬件。这在某种程度上,保证了可移植性。当需要移植到新的硬件上时,只需要重新改写与硬件相关联的那个部分。实际上,Windows在从32位CPU移植到64位CPU的时候,只改动了相当少的代码。
2.兼容性
兼容性是指让应用程序尽可能多的在各个版本上运行。Windows家族体系庞大,应该让应用程序可以运行于各个版本的Windows。这需要Windows在各个版本中有非常好的兼容性,这体现在Windows有着一致的Win32 API接口。尽管各个版本Windows的API实现方法不尽相同,但API保持着一贯的名称和调用接口。这保证了绝大多数的应用程序不用重新编译即可在不同版本的Windows上运行,即能保证二进制的兼容性。
另外,为了支持以前的部分DOS程序和16位Windows的程序,Windows最大限度地保留了对原有DOS函数的支持和对旧的16位API的支持。同时,Windows引入了环境子系统概念。不同的环境子系统,向各自的应用程序提供相应的API支持。
3.健壮性和可靠性
Windows的健壮性和可靠性主要源于用户模式和内核模式的划分。应用程序运行在特权级别低的用户模式。用户模式下,所有的错误操作都会被操作系统侦测到,并给予提示。而操作系统的大部分核心代码,运行于特权级别高的内核模式下。操作系统是经过严格测试过的,可以保证正确性。对于任何涉及操作硬件的操作,应用程序都无法在用户模式下完成,必须通过对内核模式中的系统调试来完成。
Windows的健壮性同样来自于自身的分层设计,且每层的特权不同。处在最上层的应用程序,对于操作系统的操作仅仅限于对API的操作。API是操作系统提供给应用程序的唯一接口。当应用程序想访问硬件设备时,必须向操作系统提出申请。操作系统会检验应用程序通过API提出的请求,并校验请求的参数。当认为参数非法时,会返回一个错误,这大大提高了系统的健壮性和可靠性。
4.可扩展性
可扩展性是指操作系统应该易于增加新的功能和支持新的硬件,并且对已有代码的影响达到最小。在Windows 2000中,一个很重要的设计就是内核从执行体组件中分离出来。操作系统内核只负责关于线程的调度工作。线程运行在自己的线程上下文中。线程上下文指的是CPU寄存器的状态,比如堆栈寄存器、指令寄存器等,还包括线程ID、线程的优先权、线程的本地存储等线程的相关信息。
内核的主要作用是调度线程活动,而其他操作系统的组件,比如内存管理组件、进程管理组件等作为独立于内核的组件,统称为执行程序组件。执行程序组件按照模块化的方法设计,在需要改进的时候可以修正或者增加执行程序组件。
5.性能
Windows在总体设计上是基于分层的,各个层次之间的调用会从某种程度上带来一些性能上的损失。然而这点性能上的损失可以在其他地方弥补过来。例如,在硬件抽象层,功能调用是通过宏来调用的,而不是通过函数调用。
另外,Windows是基于多进程和多线程的,并且尽可能使多个任务并行执行。在内核调度线程的时候,应该尽可能多的让各个线程保持看上去同时执行,而不是出于等待状态,这样会最小化处理器等待的时间。
最后,Windows是一个完全支持异步操作的操作系统。也就是当用户提出一个I/O申请的时候,不用等到I/O申请结束,即可立即返回,进而去执行其他操作。这样的好处是,CPU不用白白地等待I/O操作完成,而可以去做更有意义的事情,这大大提高了操作系统针对I/O的吞吐能力。在读者编写驱动程序的时候,也要注意尽量让驱动程序支持异步操作。
用户模式和内核模式
Windows从总体上分为内核模式(Kernel Mode)和用户模式(User Mode)。谈到操作系统的内核模式和用户模式,一般会和CPU的特权层联系起来。CPU一般会有多个特权层,例如,Intel的386CPU就有4个特权层,分别是0环(Ring 0),第一环(Ring 1),第二环(Ring 2),第三环(Ring 3)。其中Ring 0的特权最高,也就是可以执行任意代码,而Ring 3特权最低,只能执行有限的代码。其他CPU也有类似的特权级别。
Windows将内核模式运行在CPU的Ring0层,而将用户模式运行在CPU的Ring3层,如图2-1所示。Ring0层和Ring3层是CPU上的概念,而用户模式和内核模式是操作系统上的概念。
Windows的核心代码运行在内核模式下,而非核心代码运行在用户模式下。运行在内核模式下的Windows的核心组件是安全的,且不会受到恶意攻击,所以这些核心组件可以进行所有权限的操作。而运行在用户模式下的应用程序,是不安全且容易受到攻击的,所以用户模式下的应用程序的权限是受到限制的。如果应用程序想进行一些敏感操作,如直接访问物理内存、物理端口,应用程序需要向内核模式下的组件提出请求。
驱动程序运行在内核模式下,拥有操作系统的最高权限。因此,编写驱动程序时需要格外小心。在用户模式
下的各种保护措施在内核模式下都没有。例如,在应用程序中对空指针进行操作时,操作系统会弹出对话框,提示这是非法操作并终止进程,然而在驱动程序中对空指针进行操作的时候,操作系统不会检测这个操作是否非法,而是直接导致操作系统的崩溃。
Helloworld
加载进去必然蓝屏哦。