Windows程序设计(1)——Win32运行原理(一)
1 CPU保护模式与Windows系统
80386的CPU有3种工作模式:实模式、保护模式、和虚拟86模式。其中实模式和虚拟86模式是为了兼容8086CPU而设置的。保护模式是其主要的工作模式。Windows操作系统就运行在保护模式,而保护主要指的就是对存储器(内存和寄存器)的保护,意味着对存储器的读写是受限制的。
1.1 Windows多任务
80386在两个方面对多任务系统提供了支持:一是在硬件上为任务的切换提供良好条件,二是实现了多任务隔离。
在同一时间系统中会有多个活动的进程。每个进程都被给予它自己的私有地址空间。进程内的线程运行时,该线程仅仅能够访问属于它的进程内存空间。在不同的进程中可以有存放在相同地址的数据结构,但它们彼此没有关联,因为它们在各自的地址空间中。
这里所说的进程就是正在运行的应用程序的实例。而占用CPU时间片执行指令的是线程。
1.2 虚拟内存
在保护模式下,CPU寻址范围是0x00000000~0xFFFFFFFF(232, 4GB)。Windows会为每个进程分配4GB的地址空间,也就是虚拟内存。主要依靠CPU的支持,可以将磁盘空间当作内存空间来使用。在磁盘上应用于这一机制的文件称为页文件(paging file)。
在大多数的操作系统上,Windows将些空间的一半(4GB的前半部分, 0x00000000~0x7FFFFFFF)留给进程作为私有存储。另一半(0x80000000~0xFFFFFFFF)来存储操作系统内部的数据。
1.3 处理器的特权级别
处理器定义了4种(0~3)特权级别。Windows使用了0和3两个特权级别,对应于内核模式和用户模式。用户程序在用户模式下运行,系统程序在内核模式下运行。
当应用程序调用一个系统函数的时候,用户的应用程序会从用户模式切换到内核模式去执行。虚拟内存中的每一页的页属性都有访问模式的标识,标识哪一个模式下的代码才有权限去访问该页,这样就很好的区分了不同模式下的访问权限。
一般来说,研究WDM(Windows Driver Model)设备驱动的书讨论的是内核模式下的Windows程序设计,而SDK程序设计主要指的是用户模式下的程序设计。
2 内核对象
内核对象是系统提供的用户模式下与内核模式下代码进行交互的基本接口。经常需要创建、撕开和操作内核对象。
2.1 内核对象有什么用
为了管理应用程序,系统有必要维护一些不允许应用程序直接访问的数据。一个内核对象是一块内核分配的内存,它只能被运行在内核模式下的代码访问。内核对象记录的数据在整个系统中只有一份,所以它们也称为系统资源。
对于每一个内核对象,Windows都提供了在其上操作的API函数,这些API函数使应用程序有机会读或者写系统数据,但这一切都是在系统监视下进行的。
内核对象与普通的数据结构间最大的区别就是其内部数据结构是隐藏的,必须调用一个对象服务才能从些对象中得到数据,或者修改数据。因此,内核对象可以完成下面4个任务:
- 为系统资源提供可识别的名字。
- 在进程之间共享资源和数据。
- 保护资源不会被未经认可的代码访问。
- 跟踪对象的引用情况。使得系统知道什么时候一个对象不再被使用了, 以回收资源。
2.2 对象句柄
内核对象的数据结构仅能从内核模式访问,应用程序必须使用API函数才能访问内核对象。调用函数创建内核对象时,函数会返回标识此内核对象的句柄。可以将句柄认为是一个能被进程中所有线程使用的一个不透明的值,许多API函数需要使用它们作为参数,以便系统知道要操作哪一个内核对象。
一般来讲,句柄是进程相关的。但使用DuplicateHandle
函数可以复制进程句柄,实现多个进程共享一个内核对象。
2.3 使用计数
内核对象是进程内的资源,使用计数属性指明进程对特定内核对象的引用次数,当系统发现引用次数是0时,它就会关闭资源。
Windows程序设计(1)——Win32运行原理(一)的更多相关文章
- Windows程序设计(1)——Win32运行原理(二)
创建进程 1 进程和线程 2 应用程序的启动过程 3 CreateProcess函数 4 实例 3 创建进程 3.1 进程和线程 进程通常被定义为一个存在运行的程序的实例.进程是一个正在运行的程序,它 ...
- Windows程序设计(1)——Win32运行原理(三)
进程控制 1 获得系统进程 2 终止当前进程 3 终止其他进程 4 进程控制 4.1 获得系统进程 使用toolhelp模块可以实现获取系统中当前运行当中的进程列表. 思路如下,使用CreateToo ...
- 第二章--Win32程序运行原理 (部分概念及代码讲解)
学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...
- C++学习笔记1(Windows程序运行原理及程序编写流程)
窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcall与Lessonecl调用规范的比较,初学者常犯错误及注意事项.以下是应用程序与操作 ...
- 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程
详解游戏辅助编程 [目录] 1-什么是Windows API 2-Windows进程 3-Windows 的内存的运行原理 4-windows 中句柄的概念 5-Windows的变量类型 6-辅助实现 ...
- Windows程序设计(0)——编程之前
Windows程序设计之前 1 做什么 2 解决什么问题 3 有哪些资源 在开始真正的编程之前,需要了解要做的事情是什么,要解决的解决的问题是什么,有哪些资源可以使用. 1 Windows程序设计之前 ...
- Windows 程序设计
一.Win32 API /******************************************************************** created: 2014/04/1 ...
- Shell基础快速入门 了解shell运行原理
Shell简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界 ...
- Windows程序设计(2) -API-01 初识
Windows 程序原理 一,CPU的保护模式和windows操作系统 [x] windows 是多任务实现 [x] 虚拟内存和 各个进程的地址空间安排:2G系统空间,2G用户空间,2G用户空间是各个 ...
随机推荐
- 【IOI2014】Game
题目简述 健佳是一个喜欢做游戏的小男生.当有人问问题时,他更喜欢通过玩游戏的方式作答,而不是直接回答.健佳碰到了他的朋友梅玉,跟她讲了台湾的航空网.在台湾有 $n$ 个城市(编号为 $0, \dots ...
- POJ2104Kth Number
整体二分模板题, 有些细节需要注意 #include<cstdio> #include<cctype> #include<climits> #include< ...
- Hibernate 3 深度解析--苏春波
Hibernate 3 深度解析 Hibernate 作为 Java ORM 模式的优秀开源实现, 当下已经成为一种标准,为饱受 JDBC 折磨的 Java 开发者带来了“福音.快速的版本更新,想 ...
- 强大的开源网络侦查工具:IVRE
IVRE简介 IVRE(又名DRUNK)是一款开源的网络侦查框架工具,IVRE使用Nmap.Zmap进行主动网络探测.使用Bro.P0f等进行网络流量被动分析,探测结果存入数据库中,方便数据的查询.分 ...
- sql语句 MySQL
1.操作数据库 (1)创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specifica ...
- Swagger学习和实践
Swagger学习和实践 学习了:https://www.cnblogs.com/zxtceq/p/5530396.html swagger 英 [ˈswægə(r)] 美 [ˈswæɡɚ] vi.昂 ...
- jsp网页在浏览器中不显示图片_eclipse环境下配置tomcat中jsp项目的虚拟路径
遇到的问题是这种,在jsp网页中嵌入了本地的图片,由于会用到上传到服务器的图片,所以没有放到项目里面,而是把全部图片单独放到一个文件夹里,然后打算使用绝对路径把要显示的图片显示出来.比方是放在了E盘的 ...
- 简化动态MERGE的SQL计算
MSSQL.ORACLE等数据库支持MERGE语句更新表.但表结构未知时,因为缺乏集合类数据.用存储过程获得表结构再动态拼出SQL很麻烦,代码会有几十行之多:相同原因,用Java等高级语言实现也不简单 ...
- 【足迹C++primer】39、动态内存与智能指针(3)
动态内存与智能指针(3) /** * 功能:动态内存与智能指针 * 时间:2014年7月8日15:33:58 * 作者:cutter_point */ #include<iostream> ...
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...