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
一 地址空间
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; }
相关文章推荐
- Win32编程day01 学习笔记
- Win32编程day10 学习笔记
- Win32编程day15 学习笔记
- Win32编程day07 学习笔记
- Win32编程day02 学习笔记
- win32编程day03 学习笔记
- Win32编程day04 学习笔记
- Win32编程day05 学习笔记
- java泛型编程学习 笔记一:为什么要使用泛型
- [Linux网络编程学习笔记]索引
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(六)之Initialization & Cleanup
- 黑马程序员之C#编程基础学习笔记:让用户输入一个半径,打印出圆的面积。
- 黑马程序员之C#编程基础学习笔记:将一个字符串数组输出为|分割的形式,比如“梅西|卡卡|郑大世"
- C#学习笔记24——数据库编程
- linux 系统编程学习笔记三
- Win32学习笔记 - 文件操作
- Nginx学习笔记1—Nginx(Win32) 配置详解
- 网络编程学习笔记一:Socket编程
- Windows 核心编程学习笔记-第一章
- 编程方法学之堆栈学习笔记