Windows内核情景分析——采用开源代码ReactOS(上、下册)
分類: 图书,计算机/网络,操作系统/系统开发,WINDOWS,
作者: 毛德操著
出 版 社: 电子工业出版社
出版时间: 2009-5-1字数:版次: 1页数: 1465印刷时间:开本: 16开印次:纸张:I S B N : 9787121081149包装: 平装内容简介
本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及部分由微软公开的源代码)作为依据,使读者能深入理解Windows内核的方方面面,也可以使读者的软件开发能力和水平得到提高。
本书可供大学有关专业的高年级学生和研究生用做教学参考,也可供广大的软件工程师,特别是从事系统软件研发的工程师用于工作参考或用做进修教材。
目录
上册
第1章 概述
1.1 Windows操作系统发展简史
1.2 用户空间和系统空间
1.3 Windows内核
1.4 开源项目ReactOS及其代码
1.5 Windows内核函数的命名
第2章 系统调用
2.1 内核与系统调用
2.2 系统调用的内核入口KiSystemService()
2.3 系统调用的函数跳转
2.4 系统调用的返回
2.5 快速系统调用
2.6 从内核中发起系统调用
第3章 内存管理
3.1 内存区间的动态分配
3.2 页面异常
3.3 页面的换出
3.4 共享映射区(Section)
3.5 系统空间的缓冲区管理
第4章 对象管理
4.1 对象与对象目录
4.2 对象类型
4.3 句柄和句柄表
4.4 对象的创建
4.5 几个常用的内核函数
4.6 对象的访问控制
4.7 句柄的遗传和继承
4.8 系统调用NtDuplicateObject()
4.9 系统调用NtClose()
第5章 进程与线程
5.1 概述
5.2 Windows进程的用户空间
5.3 系统调用NtCreateProcess()
5.4 系统调用NtCreateThread()
5.5 Windows的可执行程序映像
5.6 Windows的进程创建和映像装入
5.7 Windows DLL的装入和连接
5.8 Windows的APC机制
5.9 Windows线程的调度和切换
5.10 线程和进程的优先级
5.11 线程本地存储TLS
5.12 进程挂靠
5.13 Windows的跨进程操作
5.14 Windows线程间的相互作用
第6章 进程间通信
6.1 概述
6.2 共享内存区(Section)
6.3 线程的等待/唤醒机制
6.4 信号量(Semaphore)
6.5 互斥门(Mutant)
6.6 事件(Event)
6.7 命名管道(Named Pipe)和信插(Mailslot)
6.8 本地过程调用(LPC)
6.9 视窗报文(Message)
第7章 视窗报文
7.1 视窗线程与Win32k扩充系统调用
7.2 视窗报文的接收
7.3 Win32k的用户空间回调机制
7.4 用户空间的外挂函数
7.5 视窗报文的发送
7.6 键盘输入线程
7.7 鼠标器输入线程
7.8 默认的报文处理
第8章 结构化异常处理
8.1 结构化异常处理的程序框架
8.2 系统空间的结构化异常处理
8.3 用户空间的结构化异常处理
8.4 软异常
下册
第9章 设备驱动
第10章 网络操作
第11章 文件操作
第12章 操作系统的安全性
第13章 注册表
第14章 系统管理进程与服务进程
跋
参考文献
书摘插图
上册
第2章系统调用
2.1内核与系统调用
对于应用程序的运行即应用进程而言,操作系统内核的作用体现在一组可以供其调用的函数,称为“系统调用(System Call)”,正是这些系统调用加上一些辅助的手段构成了应用软件的运行环境,即日常所说的“运行平台”。从应用软件的角度看,这些系统调用都是操作系统为其提供的服务,所以也称“系统服务(System Service)”。在本书中,“系统调用”与“系统服务”是可以互换的同义词。
从程序运行的角度看,进程是主动的、“活性(Active)”的,是发出调用请求的一方;而内核是被动(Passive)的,只是应进程的要求而提供服务。但是,从整个系统的角度看,则内核也有活性的一面,诸多应用进程就是在内核的调度下运行,所以内核有其两面性。离开进程调度,内核就只剩下了被动的一面,那就类似于一个运行时程序库了。而系统调用即系统服务,就体现了内核被动的一面。内核活性的一面即进程调度,对于应用程序而言是无形的,其目的就在于为应用软件创造一种似乎独占着CPU的假象;相比之下内核被动的一面即系统调用则是有形的,要不然应用程序就无法调用这些服务。
系统调用所提供的服务是在内核中,一般是在“系统空间”实现的,而应用软件则都在用户空间运行,二者之间有着空间的间隔,实质上是CPU运行模式的不同。所以,在应用软件与内核之间必定存在着一个明确定义的“系统调用界面”。
不过要由应用软件直接按规定的形式进行系统调用是不方便的,所以一般都要在外面包上一层,提供一套便于调用的(用户空间)库函数作为中介。在UNIX/Linux系统及后来的POSIX标准中,这就是c语言运行库的一部分。就调用的参数、返回值、作用而言,由标准C语言运行库提供的“系统调用”函数与实际的系统调用一一对应并基本相同。例如,read()是个系统调用,而用户程序引用的read()实际上是库函数,二者是对应的,并且参数的数量、类型、次序等基本相同,功能则完全相同。标准C语言运行库也提供一些建立在系统调用基础上功能有所扩充的高层库函数,例如fread0是建立在read()基础上的,但是用起来更加方便,可是那就不叫系统调用。
……