好友
阅读权限25
听众
最后登录1970-1-1
|
九零-鑫鑫
发表于 2014-1-15 01:48
本帖最后由 九零-鑫鑫 于 2014-1-15 09:41 编辑
大家好,最近学校在讲win32马上要讲完了,我整理下部分笔记给大家参考下, Win32部分主要讲了以下内容:今天是第13天win32的课程 :(前期的笔记过两天补上-另附源码) 主要的内容有:
Windows内存管理
虚拟内存分配
堆内存分配
内存映射文件
Windows内存管理
地址是地址 内存是内存 不是同一个东西
1 地址空间
程序中可以寻址的最大范围。对于32位操作系统,
地址空间范围为0-4G(2^32),地址空间越大,
相对程序的编写就会容易。
2 地址空间的划分
2.1 用户地址空间 0 - 2G(7FFFFFFF )
存放用户的程序和数据。
用户空间的代码是不能访问内核空间的数据和代码。
2.1.1 空指针区(NULL区,0-64K)系统将地址小于64K指针,都认为是空指针。
2.1.2 用户区
2.1.3 64K禁入区(0x7FFEFFFF - 0x7FFFFFFF ) 隔离带
2.2 内核地址空间 2G - 4G
存放内核的代码和数据,例如系统驱动。
内核空间代码是可以访问用户空间。
Windows 内存
1 区域
区域就是连续的一块内存。区域的大小一般为64K或者64K倍数。每个区域都有自己的状态:
1)空闲:没有被使用
2)私有:被预定的区域
3)映像:存放代码
4)映射:存放数据
2 物理内存
系统可以使用的实际内存。CPU可以直接访问的内存。
3 虚拟内存(硬盘交换文件)
将硬盘文件虚拟成内存使用。(pagefile.sys 文件)
CPU如果要访问虚拟内存数据,必须将虚拟内存数据
放到物理内存。
4 内存页
系统管理内存的最小单位。内存页大小为4K,每个
内存页有自己的权限。
5 页目表
指针地址
31 22 21 12 11 0
|-----------|------------|--------------|
10位 10位 12位
2^10=1024 1024 4K
页目 页表 页内偏移地址
6 从内存获取数据过程
6.1 根据地址在物理内存中查找相应的位置。如果找到物理内存,取回数据。如果未找到,执行6.2.
6.2 根据地址去虚拟内存中查找相应的位置。如果未找到,那么该地址没有内存空间,返回错误。如果找到,执行6.3.
6.3 将该地址所在内存页,置换到物理内存中,同时将原物理内存数据,存入到虚拟内存中。
6.4 将物理内存中的数据返回给使用者。
7 内存分配
7.1 虚拟内存分配-适合大内存分配,一般是1M之上的内存。
7.2 堆内存分配-适合小内存分配,一般是1M以下的内存。
malloc/new
7.3 栈内存分配-适合小内存分配,一般是1M以下的内存。
虚拟内存分配
1 虚拟内存分配
速度快,大内存效率高。将内存和地址分配分别执行,可以在需要的时候再提交内存。常用字大型电子表格等处理。
2 虚拟内存使用
VOID GlobalMemoryStatus( // 能够获取到当前计算机内存、地址使用情况
LPMEMORYSTATUS lpBuffer // LPMEMORYSTATUS 结构体
); // 信息不准确 误差不是太大
typedef struct _MEMORYSTATUS {
DWORD dwLength;
DWORD dwMemoryLoad;
SIZE_T dwTotalPhys; //可用的物理内存有多少
SIZE_T dwAvailPhys; //虚拟内存总大小
SIZE_T dwTotalPageFile; //最多可以写入多少数据
SIZE_T dwAvailPageFile; //还可以写入多少数据
SIZE_T dwTotalVirtual; //
SIZE_T dwAvailVirtual; //
} MEMORYSTATUS, *LPMEMORYSTATUS; //单位:字节
2.1 内存分配
LPVOID VirtualAlloc( // 申请地址
LPVOID lpAddress, // NULL或提交地址
SIZE_T dwSize, //分配的大小
DWORD flAllocationType, //分配方式
DWORD flProtect //内存访问方式
); 分配成功返回地址
flAllocationType 分配方式:
MEM_COMMIT - 提交内存,分配之后返回地址和内存空间
MEM_RESERVE- 保留地址,分配之后只返回地址,内存空间不生成。要使用内存必须再次提交。
2.2 使用
2.3 释放
BOOL VirtualFree( //可以释放内存 | 地址
LPVOID lpAddress, //释放地址
SIZE_T dwSize, //释放的大小
DWORD dwFreeType //释放方式
);
dwFreeType 释放方式:
MEM_DECOMMIT - 只释放内存
MEM_RELEASE - 地址和内存都释放
堆内存 Heap
1 堆内存分配
适合分配小内存,一般是小于1M的内存。一般每个程序都有自己的堆,
默认大小为1M,会根据使用情况适当调整。
2 堆的使用
2.1 堆的信息
GetProcessHeap - 获得程序的第一个堆 返回堆句柄
GetProcessHeaps - 获取程序中所有的堆
DWORD GetProcessHeaps(
DWORD NumberOfHeaps, // 数组的首地址
PHANDLE ProcessHeaps // 元素个数
); //返回堆的实际个数
2.2 创建堆
HANDLE HeapCreate(
DWORD flOptions, //创建选项
SIZE_T dwInitialSize, //初始化大小
SIZE_T dwMaximumSize //最大值 写0上不封顶
); 成功返回堆句柄
2.3 从堆中分配内存 (获取堆内存地址)
LPVOID HeapAlloc(
HANDLE hHeap, //堆句柄
DWORD dwFlags, //分配方式 清零
SIZE_T dwBytes //分配大小
); 成功返回地址
2.4 使用内存
2.5 释放内存
BOOL HeapFree(
HANDLE hHeap, // 堆句柄
DWORD dwFlags, // 释放方式 参数不起作用 填0
LPVOID lpMem // 释放地址
);
2.6 销毁堆
BOOL HeapDestroy(
HANDLE hHeap //堆句柄
);
当堆被销毁后,使用该堆分配内存全都被销毁。
3 VirtualAlloc/HeapAlloc/malloc/new在Windows平台上,函数调用关系:
new/malloc -> HeapAlloc ->VirtualAlloc
栈内存
栈内存-每个线程都具有自己的栈,默认大小1M。
一般是系统维护栈。
Windows提供了 _alloca, 可以在栈上分配内存。 内存映射文件
将文件映射成内存来使用。当使用内存时,就是在使用文件。
内存映射文件的使用
1 创建或打开文件CreateFile
2 创建内存映射文件
HANDLE CreateFileMapping(
HANDLE hFile, //文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全属性
DWORD flProtect, //访问方式
DWORD dwMaximumSizeHigh, //内存映射文件大小的高32
DWORD dwMaximumSizeLow, //内存映射文件大小的低32
LPCTSTR lpName //命名,可以为NULL
); 创建成功返回句柄
3 获取内存映射文件 某部分的地址
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, //内存映射文件句柄
DWORD dwDesiredAccess, //访问模式
DWORD dwFileOffsetHigh, //偏移量的高32位
DWORD dwFileOffsetLow, //偏移量的低32位
SIZE_T dwNumberOfBytesToMap //失效了 给0
); 成功返回地址
dwFileOffsetHigh和dwFileOffsetLow合成的偏移量,必须是区域粒度的整数倍(64K的整数倍)
4 使用内存
5 卸载内存映射文件(将地址和内存映射文件某部分分开)
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress //卸载地址
);
6 关闭内存映射文件
CloseHandle -
7 关闭文件
CloseHandle
--------------------------------
OpenFileMapping 打开映射文件
HANDLE OpenFileMapping(
DWORD dwDesiredAccess, // 访问方式
BOOL bInheritHandle, // 继承标识 被当前进程的子进程能否继承
LPCTSTR lpName // 内存映射文件名
); // 返回值获取内存映射文件句柄
免CB地址回复可见:
day13下载地址 http://pan.baidu.com/s/1sjo8dBJ
附件内容 项目如下:
WinVirtual、WinMapRead、WinHeap、WinMap
Day13.zip
(20.43 KB, 下载次数: 2)
希望大家多多支持 我会把每天的课堂笔记与大家分享 热心在哪里 _(:з」∠)_
day12笔记传送门:http://www.52pojie.cn/thread-233721-1-1.html
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|