win32相关(虚拟内存和物理内存)

news2025/7/21 5:38:30

虚拟内存和物理内存


在win32操作系统下,每个进程都有它自己独立的4GB空间,是window给它分配的一个虚拟空间,并不是真正的物理空间,这4GB空间中,分为高2G和低2G,高2G是应用程序的,低2G空间是给内核应用共享的空间

在这里插入图片描述
可供使用的物理内存:

MmNumberOfPhysicalPages * 4 = 物理内存
虚拟内存(硬盘空间,当物理空间【内存条】不够用时,可以设置把硬盘上的一块空间拿来当做物理内存来使用)

能够识别的物理内存:

32位的系统最多可以识别物理内存为64G,但由于操作系统的限制比如XP,只能识别4G

在这里插入图片描述

物理页分为私有的和共享的,私有的物理页只归当前申请的进程来使用,公开的物理页所有进程都可以使用

更多的细节被操作系统封装在了底层实现,我们用户在平时的使用当中是感受不到的

更多的低层实现细节需要再深一步学习内核相关的知识才能有所体会


申请内存的两种方式:

  1. 通过VirtualAlloc / VirtualAllocEx申请的 Private Memory(VirtualAlloc只能在自己的进程中申请内存,VirtualAllocEx可以在别的进程申请内存)
  2. 通过CreateFileMapping映射的 Mapped Memory
// VirtualAlloc
LPVOID VirtualAlloc(
  [in, optional] LPVOID lpAddress,			// 要分配的内存区域的地址
  [in]           SIZE_T dwSize,				// 分配的大小
  [in]           DWORD  flAllocationType,	// 分配的类型
  [in]           DWORD  flProtect			// 该内存的初始保护属性 (比如当前内存可以读可写,当前内存可以执行代码等)
);

// VirtualAllocEx
LPVOID VirtualAllocEx(
  [in]           HANDLE hProcess,			// 要在哪个进程中申请内存的进程句柄
  [in, optional] LPVOID lpAddress,			// 要分配的内存区域的地址
  [in]           SIZE_T dwSize,				// 分配的大小
  [in]           DWORD  flAllocationType,	// 分配的类型
  [in]           DWORD  flProtect			// 该内存的初始保护属性
);


#include<iostream>
#include<Windows.h>

int main() {
	// 申请2K内存并具备可读可写属性
	LPVOID pMyMem = VirtualAlloc(NULL,0x1000 * 2,MEM_COMMIT,PAGE_READWRITE);
	// 释放
	//MEM_DECOMMIT释放物理页,虚拟地址保留,MEM_RELEASE全部释放,不保留。当使用MEM_RELEASE时,dwSize参数必须为0
	VirtualFree(pMyMem,0,MEM_RELEASE); 
	return 0;
}

释放内存:

BOOL VirtualFree(
  [in] LPVOID lpAddress,					// 要释放的地址
  [in] SIZE_T dwSize,						// 释放多大的空间
  [in] DWORD  dwFreeType					// 释放的类型是什么(MEM_DECOMMIT释放物理页,虚拟地址保留,MEM_RELEASE全部释放,不保留。当使用MEM_RELEASE时,dwSize参数必须为0)
);

共享内存的申请方式:

// CreateFileMappingW 本身也是一个内核对象
HANDLE CreateFileMappingW(
  [in]           HANDLE                hFile,						// 把文件映射到物理页上,如果不需要填NULL
  [in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,		// 安全描述符
  [in]           DWORD                 flProtect,					// 指定文件映射对象的页面保护(当前前是可读还是可读可写,还是可执行等)
  [in]           DWORD                 dwMaximumSizeHigh,			// 文件映射对象的最大大小的高阶 DWORD
  [in]           DWORD                 dwMaximumSizeLow,			// 文件映射对象最大大小的低序 DWORD
  [in, optional] LPCWSTR               lpName						// 文件映射对象的名称
);

LPVOID MapViewOfFile(
  [in] HANDLE hFileMappingObject,				// 映射的FileMapping的句柄
  [in] DWORD  dwDesiredAccess,					// 对应虚拟地址的访问属性
  [in] DWORD  dwFileOffsetHigh,					// 指定文件映射的起始偏移量(64位值,由两个 32 位参数组合)高32位
  [in] DWORD  dwFileOffsetLow,					// 指定文件映射的起始偏移量(64位值,由两个 32 位参数组合)低32位	若偏移量为 0,表示从文件开头映射
  [in] SIZE_T dwNumberOfBytesToMap				// 要映射的字节数。如果为 0,则映射整个文件映射对象
);


#include<iostream>
#include<Windows.h>

HANDLE g_hMapFile;
LPTSTR g_lpBuff;

int main() {
	// 创建内核对象 INVALID_HANDLE_VALUE只创建物理页,不和其它文件做关联
	g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, L"MyFileMapping");
	// 进行映射
	g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_WRITE, 0, 0, 0x1000);
	DWORD error = GetLastError();
	*(PDWORD)g_lpBuff = 0x12345678;
	printf("%p", g_lpBuff);

	// 关闭映射(这里只是把我们当前进程的映射关系给关闭了,物理页实际还存在)
	UnmapViewOfFile(g_lpBuff);
	// 关闭句柄 (只是当前进程的关联句柄被关闭,引用计数器 -1)
	CloseHandle(g_hMapFile);
	system("pause");

	return 0;

}
  • UnmapViewOfFile // 关闭映射

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统安全管理概述与命令操作

前言&#xff1a; 1.本文将详细描述让读者了解Linux操作系统安全管理的概述和SELinux安全上下文以及基础操作命令&#xff1b; 2.本文将让读者掌握Linux操作系统防火墙firewall的结构和命令使用方法&#xff1b; 3.了解Iptables防火墙配置的结构与特点以及…

《操作系统真相还原》——中断

可以毫不夸张的说&#xff0c;操作系统离不开中断 此时我们将中断处理程序放在了汇编文件中了&#xff0c;很显然我们不能很方便的编写中断处理程序&#xff0c;不如在汇编程序里调用c函数。 在这个感觉过可以在c语言中直接内联汇编完成这些。 定时器 将时钟中断的频率提高后…

[yolov11改进系列]基于yolov11引入特征融合注意网络FFA-Net的python源码+训练源码

【FFA-Net介绍】 北大和北航联合提出的FFA-net: Feature Fusion Attention Network for Single Image Dehazing图像增强去雾网络&#xff0c;该网络的主要思想是利用特征融合注意力网络&#xff08;Feature Fusion Attention Network&#xff09;直接恢复无雾图像&#xff0c;…

助力活力生活的饮食营养指南

日常生活中&#xff0c;想要维持良好的身体状态&#xff0c;合理的营养补充至关重要。对于易受身体变化困扰的人群来说&#xff0c;更需要从饮食中摄取充足养分。​ 蛋白质是身体的重要 “建筑材料”&#xff0c;鱼肉、鸡肉、豆类制品富含优质蛋白&#xff0c;易于消化吸收&am…

pikachu通关教程-File Inclusion

文件包含漏洞 本地文件包含 http://127.0.0.1:1000/pikachu/vul/fileinclude/fi_local.php?filenamefile1.php&submit%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 首先我们把file1改成file2&#xff0c;发现切换成功 那我们可不可以上传本地文件呢&#xff0c;答案是肯定的&a…

《机器学习数学基础》补充资料:韩信点兵与拉格朗日插值法

本文作者&#xff1a;卓永鸿 19世纪的伟大数学家高斯&#xff0c;他对自己做的数学有非常高的要求&#xff0c;未臻完美不轻易发表。于是经常有这样的情况&#xff1a;其他也很厉害的数学家提出自己的工作&#xff0c;高斯便拿出自己的文章说他一二十年前就做出来了&#xff0…

Spring Boot中保存前端上传的图片

在Spring Boot中保存前端上传的图片可以通过以下步骤实现&#xff1a; 1. 添加依赖 确保在pom.xml中已包含Spring Web依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifact…

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全 本文面向对 macOS 环境和终端操作尚不熟悉的“小白”用户。我们将从最基础的概念讲起&#xff0c;结合实际操作步骤&#xff0c;帮助你在 2025 年最新 MacBook Pro&#xff08;搭载苹果 M 系列芯片&#xff09;的环境…

【ISP算法精粹】动手实战:用 Python 实现 Bayer 图像的黑电平校正

在数字成像领域&#xff0c;图像信号处理器&#xff08;ISP&#xff09;如同幕后英雄&#xff0c;默默将传感器捕获的原始数据转化为精美的图像。而黑电平校正&#xff0c;作为ISP预处理流程中的关键一环&#xff0c;直接影响着最终图像的质量。今天&#xff0c;我们就通过Pyth…

Linux中的mysql逻辑备份与恢复

一、安装mysql社区服务 二、数据库的介绍 三、备份类型和备份工具 一、安装mysql社区服务 这是小编自己写的&#xff0c;没有安装的去看看 Linux换源以及yum安装nginx和mysql-CSDN博客 二、数据库的介绍 2.1 数据库的组成 数据库是一堆物理文件的集合&#xff0c;主要包括…

[HTML5]快速掌握canvas

背景 canvas 是 html5 标准中提供的一个标签, 顾名思义是定义在浏览器上的画布 通过其强大的绘图接口&#xff0c;我们可以实现各种各样的图形&#xff0c;炫酷的动画&#xff0c;甚至可以利用他开发小游戏&#xff0c;包括市面上很流行的数据可视化框架底层都用到了Canvas。…

Gartner《Emerging Patterns for Building LLM-Based AIAgents》学习心得

一、AI代理概述 2024年,AI代理成为市场热点,它们能自主规划和行动以实现用户目标,与仅能感知、决策、行动和达成目标的AI助手及聊天机器人有本质区别。Gartner定义的AI代理是使用AI技术在数字或物理环境中自主或半自主运行的软件实体。 二、LLM基础AI代理的特性和挑战 优势…

STM32 单片机启动过程全解析:从上电到主函数的旅程

一、为什么要理解启动过程&#xff1f; STM32 的启动过程就像一台精密仪器的开机自检&#xff0c;它确保所有系统部件按既定方式初始化&#xff0c;才能顺利运行我们的应用代码。对初学者而言&#xff0c;理解启动过程能帮助解决常见“程序跑飞”“不进 main”“下载后无反应”…

4.RV1126-OPENCV 图像轮廓识别

一.图像识别API 1.图像识别作用 它常用于视觉任务、目标检测、图像分割等等。在 OPENCV 中通常使用 Canny 函数、findContours 函数、drawContours 函数结合在一起去做轮廓的形检测。 2.常用的API findContours 函数&#xff1a;用于寻找图片的轮廓&#xff0c;并把所有的数…

WEB3——开发者怎么查看自己的合约日志记录

在区块链中查看合约的日志信息&#xff08;也叫事件 logs&#xff09;&#xff0c;主要有以下几种方式&#xff0c;具体方法依赖于你使用的区块链平台&#xff08;如 Ethereum、BSC、Polygon 等&#xff09;和工具&#xff08;如 Etherscan、web3.js、ethers.js、Hardhat 等&am…

TDengine 集群容错与灾备

简介 为了防止数据丢失、误删操作&#xff0c;TDengine 提供全面的数据备份、恢复、容错、异地数据实时同步等功能&#xff0c;以保证数据存储的安全。本节简要说明 TDengine 中的容错与灾备。 容错 TDengine 支持 WAL 机制&#xff0c;实现数据的容错能力&#xff0c;保证数…

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件 MG影视App电视版是一款资源丰富、免费便捷、且专为大屏优化的影视聚合应用&#xff0c;聚合海量资源&#xff0c;畅享电视直播&#xff0c;是您电视盒子和…

【多线程初阶】内存可见性问题 volatile

文章目录 再谈线程安全问题内存可见性问题可见性问题案例编译器优化 volatileJava内存模型(JMM) 再谈线程安全问题 如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该有的结果,则说这个程序是线程安全的,反之,多线程环境中,并发执行后,产生bug就是线程不安全…

C++ 类模板三参数深度解析:从链表迭代器看类型推导与实例化(为什么迭代器类模版使用三参数?实例化又会是怎样?)

本篇主要续上一篇的list模拟实现遇到的问题详细讲解&#xff1a;<传送门> 一、引言&#xff1a;模板参数的 "三角锁钥" 在 C 双向链表实现中&#xff0c;__list_iterator类模板的三个参数&#xff08;T、Ref、Ptr&#xff09;如同精密仪器的调节旋钮&#x…

MySQL强化关键_018_MySQL 优化手段及性能分析工具

目 录 一、优化手段 二、SQL 性能分析工具 1.查看数据库整体情况 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;说明 2.慢查询日志 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;开启慢查询日志功能 &#xff08;3&#xff09;实例 3.s…