内核对象及内存映像文件介绍(一)

在Windows中有各种内核对象,如事件、文件、进程、信号量、互斥量等。

一、内核对象是什么?

内核对象是由系统内核分配管理的一段内存块,只有系统内核能够直接访问这一段内核对象数据,而应用程序只能通过Windows提供的一系列函数按规定的方式去操作这些内核对象。我们通过调用 API函数创建内核对象(这些函数通常带有Create前缀)。

二、内核对象如何调用

当我们调用一个函数创建内核对象的时候,该函数通常会返回一个标识该对象的句柄(HANDLE),把标识该内核对象的句柄传递给有关windows函数,告诉系统去操作哪一个内核对象。

三、内核对象使用介绍

内核对象属于系统内核而不是进程,内核对象可被多个进程访问使用,也即可在多个进程间共享。每个内核对象和接口一样,都自身有一个引用计数值,它记录有多少进程使用该对象,当引用计数值为零时由系统负责销毁内核对象。在多个进程间共享内核对象有三种方法:句柄继承、命名、句柄复制。内存映像文件就是内核对象的一种。

四、Windows中的进程
在Windows中每一个进程都有自己私有的地址空间,对32位的进程来说地址空间的大小是从0x00000000 到 0xFFFFFFFF共4GB范围。这个空间仅仅是内存地址的范围,而不是计算机的物理存储RAM空间,因而又称为虚拟内存空间。使用某段虚拟内存空间需要经过保留和提交两个过程,将物理存储分配映像到地址空间的该段区域上。物理存储不应理解为RAM,实际上应理解为来自于磁盘上(通常为硬盘)的系统内存分页文件,在必要时(读写访问时)其内容才会被系统写到RAM中或从RAM中写回来。磁盘上的这种系统内存分页文件又称为虚拟内存。
五、内存映像文件
几乎每个应用程序都要和文件打交道。比如,应用程序有时需要打开、读取、再关闭文件;而有时需要打开文件,将数据读到一个缓冲区再写回到文件中另一个位置。通常实
现起来都显得有点繁琐。 Windows提供了满足这两方面要求的最佳解决途径:内存映像文件。象使用虚拟内存一样,使用内存映像文件同样需要经过保留和提交两个过程,首先在进程内存空间保留一块区域,然后提交物理存储给这段区域。不同的是物理存储来自于磁盘上的文件,而不是系统的分页文件。也即将磁盘上指定的数据文件作为虚拟内存,这个实现过程被称为文件映像,可以将文件全部或部分映像到进程的地址空间中。文件映像过以后,可以把文件映像的部分当作已全部被载入内存一样的去访问它,这时又称它为内存映像文件。

六、内存映像文件使用

内存映像文件通常有三个方面的应用:
1. 系统使用内存映像文件载入和执行.EXE和.DLL文件。一方面节省了系统分页文件空间,另一方面缩短了加载应用程序开始执行所需的时间。
2. 使用内存映像文件访问磁盘上的数据文件。绕开对文件实行I/O操作和对文件内容的缓冲,交由操作系统内核去完成。
3. 使用内存映像文件可以实现在多个进程间彼此共享数据。Windows提供了在进程间进行数据通信的其它多种方法。但这些方法也是通过内存映像文件来实现的,所以内存映像文件是实现进程间通信最有效率的方法。
七、 内存映像文件使用步骤
要使用内存映像文件,可以按以下步骤:
(1) 调用Windows API 函数CreateFile()创建或是打开一个文件,得到一个标识该文件(内核对象)的句柄,它确定了哪一个磁盘文件将要作为内存映像文件。
(2) 将(1)中得到的文件对象句柄作为第一个参数调用Windows API 函数CreateFileMapping()创建一个文件映像对象。通知系统该文件的大小及对该文件的访问方式,同
时也得到一个标识该文件映像对象的句柄。
(3) 将(2)中得到的文件映像对象句柄作为第一个参数调用Windows API 函数MapViewOfFile()通知系统映像文件全部或部分内容到进程的某一段地址空间,并将此段空间
首地址通过该函数返回。这一步也就是使用虚拟内存的保留和提交过程,此后就可以利用此首地址实现对文件内容的读写了。
也可以不做第一步,直接从第二步开始,但这时要用INVALID_HANDLE_VALUE为参数作为标识文件对象的句柄,这时系统以其分页文件作为内存映像文件而不用指定磁盘上的哪一个磁盘文件。当你使用完内存映像文件后,需要做以下几步清除动作。
(1) 调用Windows API 函数UnmapViewOfFile(),通知系统释放文件映像对象在进程地址空间中占用的区域。
(2) 调用Windows API 函数CloseHandle(),分别关闭文件映像对象和文件对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值