既然Windows API编程是与Windows操作系统进行交互,所以就必须对Windows操作系统如何运行应用程序的原理搞清楚。

1、保护模式

操作系统是依附于cpu硬件的,所以操作系统所具备的功能也是cpu所给予的。Intel的32位CPU有两种主要的模式:实模式和保护模式。Dos操作系统就是运行在实模式下,而现代的操作系统都是充分利用了保护模式,从而使系统大大的安全稳定了很多。现代计算机都是用的冯诺依曼体系,其核心就是内存。所以CPU内部有寄存器,外部有内存,所以所谓的实模式和保护模式其本质就是对内存的访问形式不同。实模式就是对内存的直接访问,比如要在屏幕上显示一个数字就直接往显存中写就可以了,dos下编程就是这样的。但这有一个最大的问题就是不安全,任何程序可以随意访问内存,很容易就和操作系统的地址冲突,所以玩过dos的人都知道电脑是很容易死机的。为了解决这个问题,Intel在386以后的CPU都提供了保护模式。这种模式最重要的一个应用就是虚拟内存地址,大家都知道32位的CPU可以寻址的范围是4GB,在虚拟内存中给每一个进程都分配了4GB的虚拟地址。如果同时运行10个进程就要有10个4GB的虚拟内存,那问题来了,哪有这么多的内存呢?呵呵,所以这是虚拟内存嘛,不是真正的物理内存。只是面对进程,让程序员可以使用的内存地址,比如 int * p=new int 这句话是向电脑要一个4字节的内存,地址存在p里面,要是在实模式下p里面就是真正的物理地址,但是在保护模式下,p里面存的只是一个虚拟地址,至于真正的物理地址是多少是不允许程序员知道的,当windows拿到p后会把p里面的虚拟地址映射到一个物理地址中去的,而这一个过程是黑箱操作,普通的应用程序是不允许知道的。

2、内核空间和用户空间:

好了,现在知道在保护模式下编写程序访问的是4GB的虚拟内存,但是这4GB空间也不是全部给应用程序用的,操作系统也要使用,所以Windows规定把4GB空间分成两半,低2GB(0—0x7fffffff)空间用户可以使用,而高2GB空间(0x80000000—0xffffffff)用户不能使用,留给操作系统。所以这就有了用户空间和内核空间的区别。而这个规定其实也是用了CPU的特权级的功能:内核空间是0环,用户空间在3环,所以这就在CPU级别把内核和用户程序分割开了,目的就是确保用户程序不能骚扰内核,从而保证系统稳定。

3、内核对象:

但现在问题又来了,内核空间用户不能访问,那么操作系统的各种功能我们怎么调用呢?比如往屏幕上画一条线,在实模式下很简单,就是在显存里面写一排01010101就可以了,但是在实模式下我们只能访问2GB用户空间,显存在哪里都不知道,这怎么写啊?很容易想到的就是操作系统帮我们找显存的位置,我们只要调用操作系统的相关函数就可以了。但是操作系统在高2GB的内核空间中,我们还是不能直接使用。现在操作系统既要给我们用,又不能让我们直接用,那怎么办呢,微软的工程师想出的一个办法就是给我们一个编号,也就是句柄(HANDLE),让我们要用内核什么功能就用句柄来用,这样就不必让我们知道具体的内核地址了。从而内核对象也就自然产生,Windows对硬件的所有操作都做成一个一个内核对象,我们要用的时候就申请这个对象,然后Windows给我们一个句柄,Windows内部计数器加1,我们不用了就关闭句柄,Windows内部计数器减1,当计数器为0的时候,Windows知道这个内核对象已经不用了,所以从真实物理内存中销毁。对于我们应用程序员来说,我们要做的事情就是申请内核对象,拿到句柄,操作句柄,销毁句柄。而这个流程也就是和Windows交互的流程,也就是所谓Windows编程的本质。

Windows编程的本质的更多相关文章

  1. MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)

    为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题 ...

  2. windows编程经典书籍

    本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好.驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家发 ...

  3. 2.C++标准库函数:getline函数 定界流输入截取函数 -windows编程

    引言:今天工作遇到了一个需要按行读取txt文件数据的需求,查询了一下getline()函数,发现这竟然是一个C++的标准库函数,而且设计的很好,特地做一下记录.getline本质是一个定界流输入截取函 ...

  4. 1.windows编程入门MessageBox使用 -windows编程

    引言:刚开始入门windows编程的时候,我记得当时我对MFC的给出的一大堆代码感到束手无策.因为历史的缘故,windows编程入门的代码并没有体现出C++语言的简洁性,相反一上来就给了我们一大堆代码 ...

  5. 【Windows编程】系列第六篇:创建Toolbar与Statusbar

    上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...

  6. 【Windows编程】系列第十一篇:多文档界面框架

    前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典 ...

  7. 【Windows编程】系列第十篇:文本插入符

    大家知道,在使用微软的编程环境创建工程时会让你选择是控制台模式还是Windows应用程序.如果选择控制台的console模式,就会在运行时出现一个黑洞洞的字符模式窗口,里面就有等待输入一闪一闪的插入符 ...

  8. 【Windows编程】系列第八篇:通用对话框

    上一篇我们学习了菜单的基本编程,本篇来了解一下通用对话框的使用.Windows系统之所以是目前最流行的桌面系统,也是因为Windows有一套标准化,统一友好的交互界面,比如菜单.工具栏.状态栏以及各个 ...

  9. 【Windows编程】系列第七篇:Menubar的创建和使用

    上一篇我们学习了利用windows API创建工具栏和菜单栏,与上一篇紧密联系的就是菜单栏,菜单栏是一个大多数复杂一些的Windows应用程序不可或缺的部分.比如下图就是Windows自带的记事本的菜 ...

随机推荐

  1. 从零开始学 Web 之 HTML5(一)HTML5概述,语义化标签

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  2. gitlab+jenkins=自动化构建

    jenkins:运维持续集成工具,靠着丰富的插件挑大梁. gitlab:git代码管理仓库web版,功能强大且丰富. 本文是记录自己工作中从搭建到使用~ 前提是会点git~可以去廖老师的网站学习:ww ...

  3. Java并发编程笔记之ArrayBlockingQueue源码分析

    JDK 中基于数组的阻塞队列 ArrayBlockingQueue 原理剖析,ArrayBlockingQueue 内部如何基于一把独占锁以及对应的两个条件变量实现出入队操作的线程安全? 首先我们先大 ...

  4. Nginx/Apache之伪静态设置 - 运维小结

    一.什么是伪静态伪静态即是网站本身是动态网页如.php..asp..aspx等格式动态网页有时这类动态网页还跟"?"加参数来读取数据库内不同资料,伪静态就是做url重写操作(即re ...

  5. Docker实践:python应用容器化

    一.前言 容器使用沙箱机制,互相隔离,优势在于让各个部署在容器的里的应用互不影响,独立运行,提供更高的安全性.本文主要介绍python应用(django)跑在docker容器里,编写dockerfil ...

  6. Linux进程间通信(System V) --- 信号量

    信号量 IPC 原理 信号量通信机制主要用来实现进程间同步,避免并发访问共享资源.信号量可以标识系统可用资源的个数.最简单的信号量为二元信号量 下图为 Linux 信号量通信机制的概念图.在实际应用中 ...

  7. 编写计算器程序学习JS责任链模式

    设计模式中的责任链模式能够很好的处理程序过程的逻辑判断,提高程序可读性. 责任链模式的核心在于责任链上的元素判断能够处理该数据,不能处理的话直接交给它的后继者. 计算器的基本样式: 通过div+css ...

  8. Maven + SSM + Kaptcha 实现用户登录时验证码的获取(问题:302 Found)

    pom.xml(对Kaptcha.jar的引用) <!-- 验证码 jar kaptcha--> <dependency> <groupId>com.github. ...

  9. HTML--SVG基础

    一 SVG概述 SVG是Scalable Vector Graphics的缩写,即缩放式矢量图形; 优点: 1.使用编辑器即可编辑图形; 2.基于XML,SVG图形可以被很容易的搜索,脚本化和压缩; ...

  10. Design--源自生活美学的色彩搭配网站(design-seeds)

    All the flowers of all the tomorrows are in the seeds of today. 色彩搭配网站--design-seeds.com // 所有的颜色值都是 ...