您的位置:首页 > 编程语言

Win32编程day13 学习笔记

2012-08-20 09:14 218 查看
Windows的内存管理

一 地址空间

1 地址空间

一个程序最大的寻址范围。对于Win32操作系统最大的寻址范围是2的32次方,0-0xFFFFFFFF。这个寻址范围由CPU决定。CPU的寻址范围越大,编程难度降低。

2 地址空间的划分
通常情况下:
2.1 用户空间
地址范围 0 - 0x7FFFFFFF(2G),运行应用程序代码、数据等等。
2.2.1 空指针区(NULL区)
地址范围 0 - 0x0000FFFF
2.2.2 用户区
地址范围 0x00010000 - 0x7FFEFFFF
2.2.3 64K禁入区
地址范围 0x7FFEFFFF - 0x7FFFFFFF
2.2 内核空间
地址范围 0x80000000 - 0xFFFFFFFF,被系统使用,运行驱动、内核的数据和代码。

二 地址映射

1 区域
区域指一段连续的地址空间,区域的粒度和CPU的粒度、操作系统相关。目前通常都是以64K粒度存在,地址的对齐方式是以64K为边界。
区域的状态:
1)空闲 - 空闲的,可以被使用
2)私有 - 已经被占有,但是还未使用
3)映像 - 程序的代码使用
4)映射 - 程序的数据使用

2 物理内存
实际可以使用的物理存储器。

3 虚拟内存
使用硬盘空间作为内存扩展,也可以当作物理内存使用。

4 内存页
操作系统使用内存页的方式管理物理内存和虚拟内存。通常情况下,内存页的大小为4K或者8K。
每个内存页具有自己的状态,例如 只读/可写/可执行

5 页目表
用于管理内存页的表。
页目 - 页表 - 内存页
- 内存页
- 页表
- 页表

指针 31 -----22 21-------12 11-----------0
页目 页表 偏移量

6 地址空间的访问

6.1 地址空间已经存在映射好的物理内存,直接使用,返回。
6.2 系统去虚拟内存中,查找对应的内存页。如果未找到,系统错误返回。
6.3 系统将虚拟内存的内存页切换到物理内存当中。
6.4 返回实际物理内存地址,使用数据。

View Code

// WinMap.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

void Map( )
{
//创建文件
HANDLE hFile = CreateFile( "C:\\map.dat",
GENERIC_READ|GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL );
//创建文件映射
HANDLE hMap = CreateFileMapping( hFile, NULL,
PAGE_READWRITE, 0, 1024 * 1024, NULL );
//映射地址
CHAR * pszText = (CHAR *)MapViewOfFile(
hMap, FILE_MAP_ALL_ACCESS,
0, 0, 1024 * 1024 );
//使用内存
strcpy( pszText, "Hello File Mapping" );
printf( "%s\n", pszText );
//卸载地址
UnmapViewOfFile( pszText );
//关闭文件映射
CloseHandle( hMap );
//关闭文件
CloseHandle( hFile );
}

int main(int argc, char* argv[])
{
Map( );
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: