win32相关(虚拟内存和物理内存)
虚拟内存和物理内存
在win32操作系统下,每个进程都有它自己独立的4GB空间,是window给它分配的一个虚拟空间,并不是真正的物理空间,这4GB空间中,分为高2G和低2G,高2G是应用程序的,低2G空间是给内核应用共享的空间
可供使用的物理内存:
MmNumberOfPhysicalPages * 4 = 物理内存
虚拟内存(硬盘空间,当物理空间【内存条】不够用时,可以设置把硬盘上的一块空间拿来当做物理内存来使用)
能够识别的物理内存:
32位的系统最多可以识别物理内存为64G,但由于操作系统的限制比如XP,只能识别4G
物理页分为私有的和共享的,私有的物理页只归当前申请的进程来使用,公开的物理页所有进程都可以使用
更多的细节被操作系统封装在了底层实现,我们用户在平时的使用当中是感受不到的
更多的低层实现细节需要再深一步学习内核相关的知识才能有所体会
申请内存的两种方式:
- 通过VirtualAlloc / VirtualAllocEx申请的 Private Memory(VirtualAlloc只能在自己的进程中申请内存,VirtualAllocEx可以在别的进程申请内存)
- 通过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参数必须为0VirtualFree(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 // 关闭映射
相关文章:

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

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

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

[yolov11改进系列]基于yolov11引入特征融合注意网络FFA-Net的python源码+训练源码
【FFA-Net介绍】 北大和北航联合提出的FFA-net: Feature Fusion Attention Network for Single Image Dehazing图像增强去雾网络,该网络的主要思想是利用特征融合注意力网络(Feature Fusion Attention Network)直接恢复无雾图像,…...

助力活力生活的饮食营养指南
日常生活中,想要维持良好的身体状态,合理的营养补充至关重要。对于易受身体变化困扰的人群来说,更需要从饮食中摄取充足养分。 蛋白质是身体的重要 “建筑材料”,鱼肉、鸡肉、豆类制品富含优质蛋白,易于消化吸收&am…...
【软件测试】测试框架(unittest/pytest)
本文介绍了Python 中最常用的两个测试框架:unittest 和 pytest,帮助你编写更规范、可维护的自动化测试用例。 一、unittest 框架 unittest 是 Python 内置的标准库,无需额外安装,适合初学者入门。它借鉴了 JUnit 的设计理念&…...
Kotlin 中 companion object 扩展函数详解
companion object 的扩展函数是 Kotlin 中一个强大但稍显复杂的特性,它允许你为类的伴随对象添加新的函数。下面我会通过清晰的示例和解释帮助你理解这个概念。 基本概念 扩展函数允许你为已有的类添加新函数,而无需继承或修改原始类。当这个扩展函数是…...
MySQL半同步复制配置和参数详解
目录 1 成功配置主从复制 2 加载插件 3 半同步复制监控 4 半同步复制参数 1 成功配置主从复制 操作步骤参考:https://blog.csdn.net/zyb378747350/article/details/148309545 2 加载插件 #主库上 MySQL 8.0.26 之前版本: mysql>INSTALL PLUGIN rpl_semi_syn…...
使用FastAPI构建车牌检测识别服务
概述 FastAPI FastAPI是一个现代的高性能 Web 框架,用于使用 Python 构建 API。它可以让开发者轻松快速高效地构建 API,同时提供 API 的自动验证、序列化和文档记录等功能,是构建 Web 服务和微服务的热门选择。 YOLO YOLO(YOLO(You Only Look Once)是一种流行的物体检…...

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,发现切换成功 那我们可不可以上传本地文件呢,答案是肯定的&a…...
CppCon 2014 学习:Defensive Programming Done Right.
这段摘要讲的是: 在组件化开发中,每个开发者负责让自己写的软件易懂且好用,且不易被误用。常见误用之一是调用库函数时未满足前置条件,导致未定义行为。未定义行为的契约(contract)不一定不好,…...

《机器学习数学基础》补充资料:韩信点兵与拉格朗日插值法
本文作者:卓永鸿 19世纪的伟大数学家高斯,他对自己做的数学有非常高的要求,未臻完美不轻易发表。于是经常有这样的情况:其他也很厉害的数学家提出自己的工作,高斯便拿出自己的文章说他一二十年前就做出来了࿰…...

Spring Boot中保存前端上传的图片
在Spring Boot中保存前端上传的图片可以通过以下步骤实现: 1. 添加依赖 确保在pom.xml中已包含Spring Web依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifact…...
【HTML-15.2】HTML表单按钮全面指南:从基础到高级实践
表单按钮是网页交互的核心元素,作为用户提交数据、触发操作的主要途径,其重要性不言而喻。本文将系统性地介绍HTML表单按钮的各种类型、使用场景、最佳实践以及高级技巧,帮助开发者构建更高效、更易用的表单交互体验。 1. 基础按钮类型 1.1…...

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全
2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全 本文面向对 macOS 环境和终端操作尚不熟悉的“小白”用户。我们将从最基础的概念讲起,结合实际操作步骤,帮助你在 2025 年最新 MacBook Pro(搭载苹果 M 系列芯片)的环境…...
43. 远程分布式测试实现
43. 远程分布式测试实现详解 一、远程测试环境配置 1.1 远程WebDriver服务定义 # Chrome浏览器远程服务地址 chrome_url rhttp://localhost:5143# Edge浏览器远程服务地址 edge_url rhttp://localhost:9438关键概念:每个URL对应一个独立的WebDriver服务典型配置…...
探索大语言模型(LLM):RSE流程详解——从文档中精准识别高相关片段
前言 在信息爆炸的时代,如何从海量的文本数据中快速准确地提取出有价值的信息,成为了众多领域面临的共同挑战。RSE(检索增强摘要生成)流程应运而生,它通过一系列精细化的步骤,能够有效地从原始文档中识别出…...
【C++】类的构造函数
类的构造函数 1. 作用:2.语法规则:示例代码:构造函数语法 2.1 特点:示例代码:自定义了构造函数,系统不会再生成默认构造函数示例代码:构造函数重载 3.构造函数常见的写法3.1 无参构造函数3.2 带…...

【ISP算法精粹】动手实战:用 Python 实现 Bayer 图像的黑电平校正
在数字成像领域,图像信号处理器(ISP)如同幕后英雄,默默将传感器捕获的原始数据转化为精美的图像。而黑电平校正,作为ISP预处理流程中的关键一环,直接影响着最终图像的质量。今天,我们就通过Pyth…...
分布式存储技术全景解析:从架构演进到场景实践
目录 技术演进与市场新格局核心架构设计深度剖析前沿技术创新与性能突破行业应用场景实践挑战与未来发展趋势1. 技术演进与市场新格局 1.1 从集中式到分布式的范式转移 传统集中式存储(如NAS/SAN)在扩展性和容错性方面面临根本性瓶颈,而分布式存储通过水平扩展架构和多节点…...
JVM——从JIT到AOT:JVM编译器的云原生演进之路
引入 在Java的世界里,一段代码从开发者手中的文本到计算机执行的机器指令,需要跨越"字节码"这座桥梁。而JVM编译器正是架起这座桥梁的工程师,它的每一次技术演进都推动着Java性能的跃迁。从早期逐行翻译的解释器,到智能…...

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

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

Gartner《Emerging Patterns for Building LLM-Based AIAgents》学习心得
一、AI代理概述 2024年,AI代理成为市场热点,它们能自主规划和行动以实现用户目标,与仅能感知、决策、行动和达成目标的AI助手及聊天机器人有本质区别。Gartner定义的AI代理是使用AI技术在数字或物理环境中自主或半自主运行的软件实体。 二、LLM基础AI代理的特性和挑战 优势…...
Hive SQL优化实践:提升大数据处理效率的关键策略
在大数据生态中,Hive作为基于Hadoop的数据仓库工具,广泛应用于海量数据的离线分析场景。然而,随着数据量的指数级增长和业务复杂度的提升,低效的Hive SQL可能导致资源浪费和查询性能瓶颈。本文将从存储优化、计算优化、资源配置三…...
vue中父子参数传递双向的方式不同
在面试中被问到。平时也有用到,但是缺少总结 父传子。父页面会给子页面中定义的props属性传参,子页面接收子传父。父页面需要监听事件来接收子页面通过$emit发送的消息其实说的以上两种都是组件之间传递。还可以通过路由传参, 状态管理器的方式传递 下面…...
LLM 使用 MCP 协议及其原理详解
LLM 使用 MCP 协议及其原理详解 🧠 一、MCP 协议概述 1. MCP 是什么? MCP(Modular Communication Protocol)是一种面向语言模型设计的通用通信协议,其设计目标是: 模块化(Modular࿰…...
DAY 36神经网络加速器easy
仔细回顾一下神经网络到目前的内容,没跟上进度的同学补一下进度。 ●作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。 ●探索性作业(随意完成):尝试进入…...

STM32 单片机启动过程全解析:从上电到主函数的旅程
一、为什么要理解启动过程? STM32 的启动过程就像一台精密仪器的开机自检,它确保所有系统部件按既定方式初始化,才能顺利运行我们的应用代码。对初学者而言,理解启动过程能帮助解决常见“程序跑飞”“不进 main”“下载后无反应”…...

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