吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4501|回复: 11
收起左侧

[C&C++ 转载] Win32笔记整理 day13

[复制链接]
九零-鑫鑫 发表于 2014-1-15 01:48
本帖最后由 九零-鑫鑫 于 2014-1-15 09:41 编辑

大家好,最近学校在讲win32马上要讲完了,我整理下部分笔记给大家参考下,
Win32部分主要讲了以下内容:
今天是第13win32的课程 (前期的笔记过两天补上-另附源码)
  主要的内容有:
         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

免费评分

参与人数 2热心值 +2 收起 理由
傲月孤狼 + 1 加油啊,支持
ingdear + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 九零-鑫鑫 发表于 2014-1-15 01:50
希望大家多多支持 谢谢
1354669803 发表于 2014-1-15 01:54
 楼主| 九零-鑫鑫 发表于 2014-1-15 01:55
1354669803 发表于 2014-1-15 01:54
骚年在哪学习呢

一个小培训机构 _(:з」∠)_
csa 发表于 2014-1-15 08:44
谢谢分享啦。。
窝窝头3号 发表于 2014-1-15 09:07
好人一生平安
ingdear 发表于 2014-1-15 09:09
整理得不错。
jrf 发表于 2014-1-15 09:51
嘿嘿,这个可以有!!...
www52pojiecn 发表于 2014-1-15 10:50
谢谢提供,继续期待
q546624527 发表于 2014-1-15 11:10
不明觉厉..
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 07:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表