深入解析Windows操作系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《深入解析Windows操作系统》是由著名的操作系统专家编写的Windows操作系统原理的著作,在今后很长的一段时间内,我将我学过的一些东西以学习笔记的形式总结出来提供给大家,大家可以跟着我一起了解和学习,也可以去买这本《深入解析Windows操作系统》,让我们共同探究Windows的神秘世界。

一、基本概念和术语
★WinAPI:我的中文名叫“Windows应用编程接口”英文名叫“Windows API”
Windows API包括几千个可调用的函数,他们可以被分成以下几个分类:
基本服务,组件服务,用户界面服务,图形和多媒体服务,消息和协作,网络,Web服务。

那么我们如何查询到Windows API呢?这里用到的是微软提供的SDK(平台软件开发工具),通过MSDN可以在线免费查阅SDK文档()MSDN是指微软对开发人员的支持计划。

★服务,函数
Windows API 函数:指Windows API中已经被文档化的可调用子例程。

例如CreateProcess 原生的系统服务:指在操作系统中未被文档化的可在用户模式下调用的底层服务。

例如NtCreateProcess
Windows服务:指由Windows服务管理器(services.exe)启动的进程。

DLL:动态链接库,指一组可调用的子例程,合起来被链接成一个二进制文件,使用这些子例程的应用程序可以动态的加载此二进制文件。

★进程,线程和作业
进程可以理解为一个容器,其中包含了当执行一个程序的特定实例时所用到的各种资源。

从最高层次来看,一个Windows进程由以下几个元素组成:
一个私有的地址空间,这是指该进程可以使用的一段虚拟内存地址。

一个可执行程序,它定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中。

一个已打开句柄的列表,这些句柄指向各种系统资源,比如信号量,通信端口和文件,该进程内所有的线程都可以访问这些系统资源。

一个被成为访问令牌的安全环境,它标识了与该进程关联的用户,安全组和特权。

一个被称为进程ID的唯一标识符。

至少一个执行线程。

★线程
线程是一个进程内部的实体,也是Windows执行此进程时的调度实体。

如果没有线程,则进程的程序不可能运行。

线程包括以下一些最基本的部件:
一组代表处理器状态的CPU寄存器的内容;
两个栈,一个用于当线程在内核模式下执行的时候,一个用于当线程在用户模式下执行的时候;
一个被称为线程局部存储区的私有存储区域;
一个被称为线程ID的唯一标识符;
有时候线程也有他们自己的安全环境,如果多线程服务器应用程序要模仿其客户的安全环境,则往往可以利用线程的安全环境。

虽然线程有自己的执行环境,但是同一个进程内部所有线程共享该进程的虚拟地址空间以及其余的属于该进程的资源,这意味着,一个进程内的所有线程可以读或者写另一个线程的内存。

但一个进程的线程不能直接引用另一个进程的地址空间,除非有两种情况:第二个进程将他的一部分私有地址空间变成共享内存区;或者第一个进程有权打开第二个进程。

★虚拟内存
Windows实现了一个基于平面(线性)地址空间的虚拟内存系统。

这使得每个进程感觉自己独立拥有一个很大的地址空间。

对于32位的进程来说,这个地址空间是4GB。

虚拟内存不是真正的内存,它通过映射的方法,使可用的虚拟地址达到4GB,每个应用程序可以被分配到2GB的虚拟地址,剩下的2GB留给操作系统自己用。

简单的说,虚拟内存实现方法和过程如下:
1.
当一个应用程序被启动时,操作系统就创建一个新进程,并给每个进程分配2GB的虚拟地址(不是内存,是地址)
2.
虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某个位置,并把当前所需要的代码读取到物理地址中(注意:虚拟地址和应用程序代码在物理内存中的位置是没有关系的)
3.
如果使用动态链接库DLL,DLL也被映射到进程的虚拟地址空间,在需要的时候才被读入物理内存。

4.
其他项目(例如数据,堆栈)的空间是从物理内存中分配的,并被映射到虚拟地址空间中。

5.
应用程序通过使用它的虚拟地址空间中的地址开始执行,然后虚拟内存管理器把每次的内存访问映射到物理位置。

注意:在32位操作系统中,应用程序是不会直接访问物理地址的。

虚拟内存管理器通过虚拟地址的访问请求,控制所有的物理地址访问。

每个应用程序都有相互独立的4GB寻址空间,不同应用程序的地址空间是隔离的。

★句柄
句柄是一种Windows标识,由应用程序建立或使用的对象所使用的一个唯一的整数值。

Windows要使用各种各样的句柄来标识诸如应用程序实例,窗口,图标,文件,互斥量等对象。

程序通过调用Windows函数获取句柄,然后在其他Windows函数中使用这个句柄,以引用它代表的对象。

句柄的实际值对程序来说无关重要,这个值是被Windows模块内部用来应用相应对象的。

比如我们要对一个文件进行操作,这时候Windows不会像我们那样直接根据文件路径等信息找该文件或者进行操作,而是调用一些函数获得该文件的句柄,然后再用这些句柄对该文件进行操作,它只是一个标识而已。

★内核模式和用户模式
Intel x86处理器的体系结构定义了四种特权级,或者称为4个环,来保护系统代码和数据不会被低级别的代码恶意或者无意的改掉。

Windows仅使用了其中的两个环,即0环(内核模式)和3环(用户模式)。

用户程序代码运行在用户模式下,而操作系统代码运行在内核模式下。

内核模式是这样的一种处理器执行模式,它允许访问所有的系统内存和所有的CPU 指令,处理器让操作系统软件比应用软件有更高的特权级,从而为操作系统设计者提供了一层保护的基础,确保一个行为不正常的应用程序不会破坏系统整体的稳定性。

参考书籍:《深入解析Windows操作系统》第四版
《加密与解密》第三版。

相关文档
最新文档