版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Windows程序设计基础,32位处理器有3种工作模式: 实模式:重启以后到载入WINDOWS以前都是实模式,纯32位windows是不能进入实模式的。 保护模式:保护模式提供的保护机制管理和维护自己 ,保护主要指对存储器的保护。进入保护模式是每个32位系统必须的 。 虚拟86模式:为了让以前的16位程序能在32位下运行,32位处理器就提供了虚拟86模式 。,第二章 win32程序运行原理,2.1 CPU的保护模式和Windows系统,扩展模式: 1)兼容模式:该模式下,64位操作系统运行在32位兼容环境,能正常运行16,32位应用程序就像基本的保护模式一样,访问32位地址空间,但不能运行纯1
2、6位实模式程序(就是不能运行虚拟86模式程序了)。 2)64位模式:在该模式下,处理器完全执行64位指令,使用64位地址空间和64操作数,运行16,32位程序必须切换到兼容模式。,64位处理器,系统管理模式:当SMI引脚为有效进入系统管理模式,首先保存当前的CPU上下文。它有独立的地址空间,用来执行电源管理或系统安全方面的指令。(基本模式),32位处理器对多任务操作系统的支持性主要体现在 1)在硬件上为任务之间的切换提供了良好的条件 2)实现了多任务隔离,“进程”地址空间独立 在windows下,任务被进程取代,进程就是正在运行的应用程序的实例。但是占用cpu时间片的不是进程,而是线程。,Wi
3、ndows的多任务实现,虚拟内存,保护模式下,32位处理器有32根地址线,处理器寻址范围(0 x000000000 xFFFFFFFF)(232,4GB)。,32位机器上的RAM的大小很难达到4GB,windows为每个进程分配4GB的地址空间主要依靠cpu的支持。cpu在保护模式下支持虚拟内存。它可以帮助操作系统将磁盘空间当作内存空间来使用。,各进程内的地址空间安排,用户空间部分是进程私有地址空间,进程不能以任何方式读、写其他进程此部分空间中的数据。对所有应用程序,大量进程数据被保存在块空间中而相互独立,所以应用程序很少被其他程序打断,使系统更加稳定。 系统空间部分放置操作系统的代码,包括内
4、核代码、设备驱动代码、设备I/O缓冲区等。系统空间部分在所有的进程中是共享的。在32位系统中,这些数据结构被完全的保护起来,如果试图访问这部分内存,访问线程会遇到一个访问异常。,两种地址空间区别,32位处理器共定义了4种(0-3)特权级别,或称环。 0是最高级(特权级),3级是最低级(用户级)。 为了阻止应用程序访问或者修改关键的系统数据,windows提供了两种访问模式: 内核模式(使用0级):系统程序的代码在此模式下运行 用户模式(使用3级):用户程序的代码在此模式下运行,内核模式和用户模式,CPU支持的特权级类别,在实模式下,没有级别之分.在保护模式下,CPU有4个特权级别.,虽然每个进
5、程都有自己的4G地址空间。但内核模式下的系统和设备驱动程序共用一块虚拟地址空间。即整个系统共用的2G部分。虚拟内存中的每一页的页属性中都有访问模式标记,它标识了哪一个模式下的代码才有权限访问该页。系统地址空间的页仅仅能够从内核模式访问,所有用户地址空间的页都从用户模式访问。 当应用程序调用一个系统函数的时候,用户的应用程序会从用户模式切换到内核模式去执行。例如:Win32函数ReadFile最终会调用Windows内部的从文件中读取数据的程序代码,因为这些代码访问了系统内部的数据,所以他们必须运行在内核模式下。,内核模式: 研究WDM(Windows Driver Model) 设备驱动类 用
6、户模式: SDK程序设计,两种模式下的程序设计,内核对象是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口。软件开发人员会经常的创建、打开和操作内核对象。,2.2 内核对象,为了管理应用程序,系统有必要维护一些不允许用户应用程序直接访问的数据。一个内核对象就是一块内核分配的内存,它只能被运行在内核模式下的代码访问。内核对象记录的数据在整个系统中只有一份,故也称系统资源。,内核对象和普通的数据结构间的最大区别是其内部数据结构是隐藏的,必须调用一个对象服务才能从此对象中得到数据,或者是向其输入数据,而不能直接读或者改变对象的内部数据。增加这些限制来保证内核对象包含一致的状态。,引入内核对
7、象,系统可方便的完成以下任务: 1)为系统资源提供可识别的名字。 2)在进程之间共享资源和数据。 3)保护资源不被未经认可的代码访问。 4)跟踪对象的引用情况。在不被使用时,释放占有空间。,内核对象的数据结构仅能从内核模式访问,所以直接在内存中定位这些数据结构对应用程序来说是不可能的。应用程序必须使用API函数访问内核对象。调用函数创建内核对象时,函数会返回标识此内核对象的句柄。 为了使系统稳定,这些句柄和进程有关,就是仅对创建该内核对象的进程有效。 若要多个进程共享一个内核对象,要调用DuplicateHandle函数复制一个进程句柄传给其他进程即可。,对象句柄,内核对象是进程内的资源,使用
8、计数属性指明进程对特定内核对象的引用次数,第一次创建内核对象时,系统为进程分配内核对象资源,并将该内核对象的使用计数属性初始化为1。打开一次使用计数加1,关闭,系统将使用计数减1,当系统发现引用次数是0时,它就会自动关闭资源。,使用计数,2.3 进程的创建,进程和线程,进程是一个正在运行的程序,它拥有自己的虚拟地址空间,拥有自己的代码、数据和其他系统资源,如进程创建的文件、管道、同步对象等。一个进程也包含了一个或者多个运行在此进程内的线程。,线程是进程内执行代码的独立实体。没有它,进程中的程序代码是不可能执行的。操作系统创建进行后会创建一个线程执行进程中的代码,称主线程,它在运行过程中创建其他
9、线程,一般将主线程创建的线程称为该进程的辅助线程。,进程是不活泼的,一个进程要完成任何事情,必须有一个运行在它的地址空间中的线程。此线程负责执行该进程地址空间的代码。每个进程至少拥有一个在它的地址空间中运行的线程。对一个不包含任何线程的进程来说,它是没有理由继续存在下去的,系统会自动销毁该进程和它的地址空间。,进程和程序,程序:一连串静态的指令 进程:一个容器,它包含一系列运行在这个程序实例上下文中的线程使用的资源。,Win32进程的两个组成部分,进程内核对象:操作系统使用此内核对象来管理该进程。这个内核对象也是操作系统存放进程统计信息的地方。 私有的虚拟地址空间:此地址空间包含了所有可执行的
10、或者是DLL模块的代码和数据,它也是程序动态申请内存的地方,比如说线程堆栈和进程堆。,应用程序必须有一个入口函数,它在程序开始运行时被调用。控制台应用程序入口函数是main。 int main(int argc,char* argv),应用程序的启动过程,CreateProcess函数,WIN32API函数CreateProcess用来创建一个新的进程和它的主线程, 这个新进程运行指定的可执行文件。函数原型:BOOL CreateProcess( LPCTSTR lpApplicationName, /可执行文件名称 LPTSTR lpCommandLine, /指定要传递给执行模块的参数 L
11、PSECURITY_ATTRIBUTES lpProcessAttributes,/进程安全性 LPSECURITY_ATTRIBUTES lpThreadAttributes, /进程安全性 BOOL bInheritHandles, /指定当前进程中的可继承句柄是否可被新进程继承 DWORD dwCreationFlags, /指定新进程的优先级及其他创建标志 LPVOID lpEnvironment, /指定新进程使用的环境变量 LPCTSTR lpCurrentDirectory, /指定新进程使用的当前目录 LPSTARTUPINFO lpStartupInfo, /指定新进程中主窗
12、口的位置、大小和句柄等 LPPROCESS_INFORMATION lpProcessInformation/返回新进程的标志信息 );,lpApplicationName:指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数的最前面并由空格符与后面的字符分开。这个被指定的模块可以是一个Win32应用程序。如果适当的子系统在当前计算机上可用的话,它也可以是其他类型的模块(如MS-
13、DOS 或 OS/2)。,lpCommandLine:指向一个NULL结尾的、用来指定要运行的命令行。 这个参数可以为空,那么函数将使用参数指定的字符串当作要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。,如果lpApplicationName参数为空,那么这个字符串中的第一个被空格分隔的要素指定可执行模块名。如
14、果文件名不包含扩展名,那么.exe将被假定为默认的扩展名。如果文件名以一个点(.)结尾且没有扩展名,或文件名中包含路径,.exe将不会被加到后面。如果文件名中不包含路径,Windows将按照如下顺序寻找这个可执行文件: 1.当前应用程序的目录。 2.父进程的目录。 3.Windows 95:Windows系统目录,可以使用GetSystemDirectory函数获得。 Windows NT:32位Windows系统目录。可以使用GetSystemDirectory函数获得,目录名是SYSTEM32。 4.在Windows NT中:16位Windows系统目录。不可以使用Win32函数获得这个目
15、录,但是它会被搜索,目录名是SYSTEM。 5.Windows目录。可以使用GetWindowsDirectory函数获得这个目录。 6.列在PATH环境变量中的目录。如果被创建的进程是一个以MS-DOS或16位Windows为基础的应用程序,lpCommandLine参数应该是一个以可执行文件的文件名作为第一个要素的绝对路径,因为这样做可以使32位Windows程序工作的很好,这样设置lpCommandLine参数是最强壮的。,dwCreationFlags:指定附加的、用来控制优先级和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。,值:CREATE_DEFA
16、ULT_ERROR_MODE含义:新的进程不继承调用进程的错误模式。,值:CREATE_NEW_CONSOLE含义:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用。,值:CREATE_NEW_PROCESS_GROUP含义:新进程将使一个进程树的根进程。进程树种的全部进程都是根进程的子进程。,值:CREATE_SUSPENDED含义:新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。值:CREATE_UNICODE_ENVIRONMENT含义:如果被设置,由lpEnvironment参数指
17、定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符。,优先级:HIGH_PRIORITY_CLASS 含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保证正确。这个优先级的程序优先于正常优先级或空闲优先级的程序。一个例子是Windows任务列表,为了保证当用户调用时可以立刻响应,放弃了对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优先级的CPU关联应用程序可以占用几乎全部的CPU可用时间。优先级:IDLE_PRIORITY_CLASS 含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断。例如屏幕保护程序。空闲优先级会被
18、子进程继承。优先级:NORMAL_PRIORITY_CLASS 含义:指示这个进程没有特殊的任务调度要求。优先级:REALTIME_PRIORITY_CLASS 含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统进程。例如,一个执行时间稍长一点的实时进程可能导致磁盘缓存不足或鼠标反映迟钝。,STARTUPINFO结构,typedef struct DWORD cb;/本结构长度,总是应该被设为sizeof(STARTUPINFO) LPTSTR lpReserved;/保留字段 LPTSTR lpDesktop;/指
19、定桌面名称 LPTSTR lpTitle; /控制台应用程序用,指定控制台窗口标题 DWORD dwX;/指定新创建窗口的位置坐标和大小信息 DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars;/控制台程序用,指定控制台窗口的行数 DWORD dwYCountChars; DWORD dwFillAttribute ;/控制台程序用,指定控制台窗口的背景色 DWORD dwFlags;/标志,它的值决定STARTUPINFO结构中那些成员的值有效 WORD wShowWindow; /窗口的显示方式 WORD cbReser
20、ved2; LPBYTE lpReserved2; HANDLE hStdInput; /控制台程序使用,几个标准句柄 HANDLE hStdOutput; HANDLE hStdError; STARTUPINFO, *LPSTARTUPINFO;,PROCESS_INFORMATION结构,typed struct HANDLE hProcess;/新建进程的内核句柄 HANDLE hThread;/新建进程中主线程的内核句柄 DWORD dwProcessId;/新建进程的ID DWORD dwThreadId;/新建进程的主线程ID PROCESS_INFORMATION,*LPPRO
21、CESS_INFORMATION;,获取系统进程 首先使用CreateToolhelp32Snapshot函数给当前系统内执行的进程拍快照,也就获得一个进程列表,这个列表中记录着进程的ID、进程对应的可执行文件的名称和创建该进程的进程ID等数据。然后使用Process32First函数和Process32Next函数遍历快照中记录的列表。,2.4 进程的控制,结构,typedef struct DWORD dwSize;/结构的长度,必须预先设置 DWORD dwUsage;/进程的引用计数 DWORD th32ProcessID;/进程ID DWORD;进程默认堆的 ;进程模块的 ;进程创建
22、的线程数 ;进程的父线程 ;进程创建的线程的基本优先级 ;内部使用 ;进程对应的可执行文件名 ;,终止当前进程-ExitProcess函数 终止进程就是结束程序的执行,让它从内存中卸载。终止原因: 1)主线程的入口函数返回。 2)进程中一个线程调用了ExitProcess函数 3)此进程中的所有线程都结束了。 4)其他进程中的一个线程调用了 TerminateProcess函数。,终止其他进程- TerminateProcess函数 对一个进程操作前,必须首先取得该进程的进程句柄。 CreateProcess函数创建进程后返回一个进程句柄。对已存在进程,用OpenProcess函数取得这个进程的访问权限。,保护进程 保护进程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年泸州市部分企事业单位人才引进88人备考题库及参考答案详解一套
- 2025年蒲江县寿安社区卫生服务中心编外人员招聘备考题库及答案详解1套
- 少先队工作落实责任制度
- 项目法人质量责任制度
- 预防接种工作责任制度
- 食品厂出厂检验责任制度
- 食堂电蒸车岗位责任制度
- 墓地内部管理制度及流程
- 看守所内部财务制度
- 2025年东方市安康医院招聘6人备考题库有答案详解
- 机电一体化毕业论文8000字
- 森林防火-整改方案(3篇)
- 《跨文化传播教程》全套教学课件
- DL∕T 473-2017 大直径三通锻件技术条件
- AQ 1119-2023 煤矿井下人员定位系统技术条件
- TD/T 1033-2012 高标准基本农田建设标准(正式版)
- 2024年北师大版五年级下册数学第一单元综合检测试卷及答案
- GB 15630-1995消防安全标志设置要求
- 第一课冬休みの予定 单词课件-高中日语华东理工版新编日语教程2
- 中石油设备及管道定点测厚指导意见
- 文物保护学概论(全套260张课件)
评论
0/150
提交评论