欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Windows编程的本质

程序员文章站 2022-06-26 08:52:56
既然Windows API编程是与Windows操作系统进行交互,所以就必须对Windows操作系统如何运行应用程序的原理搞清楚。 1、保护模式 操作系统是依附于cpu硬件的,所以操作系统所具备的功能也是cpu所给予的。Intel的32位CPU有两种主要的模式:实模式和保护模式。Dos操作系统就是运 ......

既然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编程的本质。