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运行原理(一)的更多相关文章

  1. Windows程序设计(1)——Win32运行原理(二)

    创建进程 1 进程和线程 2 应用程序的启动过程 3 CreateProcess函数 4 实例 3 创建进程 3.1 进程和线程 进程通常被定义为一个存在运行的程序的实例.进程是一个正在运行的程序,它 ...

  2. Windows程序设计(1)——Win32运行原理(三)

    进程控制 1 获得系统进程 2 终止当前进程 3 终止其他进程 4 进程控制 4.1 获得系统进程 使用toolhelp模块可以实现获取系统中当前运行当中的进程列表. 思路如下,使用CreateToo ...

  3. 第二章--Win32程序运行原理 (部分概念及代码讲解)

    学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...

  4. C++学习笔记1(Windows程序运行原理及程序编写流程)

    窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcall与Lessonecl调用规范的比较,初学者常犯错误及注意事项.以下是应用程序与操作 ...

  5. 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程

    详解游戏辅助编程 [目录] 1-什么是Windows API 2-Windows进程 3-Windows 的内存的运行原理 4-windows 中句柄的概念 5-Windows的变量类型 6-辅助实现 ...

  6. Windows程序设计(0)——编程之前

    Windows程序设计之前 1 做什么 2 解决什么问题 3 有哪些资源 在开始真正的编程之前,需要了解要做的事情是什么,要解决的解决的问题是什么,有哪些资源可以使用. 1 Windows程序设计之前 ...

  7. Windows 程序设计

    一.Win32 API /******************************************************************** created: 2014/04/1 ...

  8. Shell基础快速入门 了解shell运行原理

    Shell简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界 ...

  9. Windows程序设计(2) -API-01 初识

    Windows 程序原理 一,CPU的保护模式和windows操作系统 [x] windows 是多任务实现 [x] 虚拟内存和 各个进程的地址空间安排:2G系统空间,2G用户空间,2G用户空间是各个 ...

随机推荐

  1. Hibernate游记——装备篇《二》(基础配置示例)

    <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  2. 在github上创建自己的代码仓库

    git用了很久了,github也用很久了,但一直都是使用别人的项目, 最近想把自己写的一些代码放到自己的帐号上去 以为就是很简单的代码推送,真正做一次时候才发现,原来坑还不少呢, 就把这次的经历记录一 ...

  3. 微信小程序踩坑之一[thist]使用技巧

    刚上手小程序 时,习惯把this当成jquery中的$(this)来用,实际上这两个还是有差别的 在页面方法中调用其他方法,一般是用this.function(),直接调用小程序 的方法或函数则是用w ...

  4. android学习资源

    https://codelabs.developers.google.com/ https://developer.android.com/ http://v.youku.com/v_show/id_ ...

  5. spring aop提供了两种实现方式jdk和cglib

    Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. Sprin ...

  6. Android图片缓存之Bitmap详解(一)

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. Bitmap: Bitmap是Android ...

  7. 邁向IT專家成功之路的三十則鐵律 鐵律八:IT人學習之道-基礎功

    修練過中國武術的人都知道,任何一種拳法的學習最重要的就是基礎功,而基礎功又可分為內在與外在的修練,內在的修練強調在平心.靜氣.不爭的調息.至於外在這首重在站樁.鬆沉.不疾不徐的應對能力.有了深厚基礎的 ...

  8. 【mac IntelliJ Idea】mac上 idea快速重写父类方法 快捷键

    windows上快捷键: Ctrl+O Mac上快捷键: command+O 在要重写父类方法的位置 ,按下快捷键,然后选择要重写的方法即可.

  9. 查找——图文翔解SkipList(跳跃表)

    跳跃表 跳跃列表(也称跳表)是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作须要O(logn)平均时间). 基本上.跳跃列表是对有序的链表添加上附加的前进链接,添加是以随 ...

  10. web前端面试系列 - 数据结构(两个栈模拟一个队列)

    一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...