11、Windows API 内存管理(1)

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 一、相关概念 1、内存主要储存程序运行时所需的机器代码、数据等内容。     内存的最小存储单元是字节,内存中的每一个字节都有一个地址。在32位系统上,使用32位的数来表示内存地址,因此一共可以表示232 (4294967296-4G)个字节。

一、相关概念<?xml:namespace prefix = o />

1、内存主要储存程序运行时所需的机器代码、数据等内容。

    内存的最小存储单元是字节,内存中的每一个字节都有一个地址。在32位系统上,使用32位的数来表示内存地址,因此一共可以表示232 (4294967296-4G)个字节。

2、地址

(1)地址空间。

    系统中所有可用的内存地址的集合称为地址空间。比如,如果可以使用4GB的内存,那么其地址空间就是0x00000000~0xFFFFFFFF。

(2)物理内存。

    硬件系统中真实存在的存储空间称为物理内存,物理内存的访问通过硬件系统总线进行的。

    但不是每台32位的机器都具有4GB的物理地址空间,因此物理地址空间不一定是0x00000000~0xFFFFFFFF,比如在物理内存为1GB的系统上,就可能只有0x00000000~0x3FFFFFFF的地址可以使用。

(3)虚拟地址空间。

    为了访问内存的统一和方便,操作系统允许其上运行的程序访问所有的4GB内存空间中的地址。因此操作系统必须进行一些必要的地址转换工作,将程序访问的地址转换为物理内存中的真实物理地址,然后进行数据的存取。操作系统进行转换后,供程序使用的地址空间称为虚拟地址空间。在32位系统上,可以使用的虚拟地址空间大小是4GB。

    当然,由于虚拟地址空间可能比真实物理地址空间大,系统会将部分虚拟地址空间中的地址转换为硬盘中的数据,在必要时将物理内存中的数据与硬盘中的数据进行交换。

    这种地址转换和数据交换是通过分页和分段机制实现的

(4)进程的内存空间:用户内存空间与内核内存空间。

    Windows操作系统中的每个进程都有属于自己的虚拟地址空间。32位的Window操作系统将4GB(在64位系统上,这个值达到了8TB)的虚拟内存划分为两个部分,进程使用2GB,称为用户进程空间;内核使用2GB,称为系统地址空间或内核地址空间(也可设置为用户进程空间使用3GB,内核使用1GB,这里只讨论各为2GB的情况),用户空间的地址范围为0x000000000x7FFFFFFF,内核空间的地址范围为0x80000000~0xFFFFFFFF。虚拟地址空间在进程上是封闭的,进程只能访问属于自己的地址空间,如果要访问其他进程的地址空间需特殊的机制。

3、分页与分段内存管理、内存映射与地址转换

32位地址的高10位称为页目录索引(Directory)、次10位称为页表索引(Table),余下的12位为偏移(Offset)。如果只取前两个部分的20位,末位补0,那么其可能指向的地址都是4KB( 212)对齐的,也就是页的基地址。所以32位中的前20位定位了页的基地址(PFN),而最后12位是地址在页内的偏移。

相当于先选定那本书,再选定那本书的页数,再选中页中的那行。

    在地址转换的过程中,还涉及一个关键的系统寄存器CR3。CR3寄存器中的高12~32位保存了页目录索引在物理内存中的地址。

wps_clip_image-647

地址转换经过了如下过程。

(1)从CR3寄存器的12~32位中取出地址,末位补0,构成一个32位的地址,此地址是页目录所在物理内存的基地址(因此页目录在内存中肯定是4KB对齐的)。

(2)以线性地址中的高10位的页目录索引(Directory)中数据为偏移,加上上一步得到的页目录所在物理内存的基地址,在页目录中找到相应的页目录项(PDE)。

(3)页目录项中包括了页表的基地址,线性地址中的页表索引(Table)是页表中的偏移,找到页表项(PTE)。

(4)页表项(PTE)中存储的是物理地址空间中的页面的地址(PFN),如果PFN指向的页面是无效的(不在物理内存中),那么会在系统内核中引起页错误,系统内核会进行页面调度,将物理内存中暂不使用的页面交换到硬盘中,将硬盘中需要访问的页面交换到物理内存中,使用PFN指向的页是有效的。

(5)现在已经找到了线性地址所对应的物理地址所在的页的基址。

(6)在物理页地址的基础上,加上线性地址末12位的偏移,可得到线性地址与物理地址的对应。

    从中可以看出地址转换是以页为单位的,也就是线性地址与所对应的物理地址的页基地址(PFN)是会变化的,在页内的偏移地址是不会发生变化的。

    每一个页目录项对应了一个页表,一共有210个页目录。每一个页表项对应了一个内存分页,每个页表是最多可以表示210个页表。最多一共是多有220个页。

wps_clip_image-18033

目录
相关文章
|
6月前
|
监控 编译器 API
[笔记]Windows核心编程《二十二》注入DLL和拦截API(一)
[笔记]Windows核心编程《二十二》注入DLL和拦截API
144 0
|
3月前
|
存储 缓存 Java
释放C盘空间:释放Windows休眠文件和关闭虚拟内存
在 Windows 11 专业版中,可以通过以下步骤来释放休眠文件(Hibernate File),以释放磁盘空间。休眠文件是系统休眠(Hibernate)功能所需要的文件,它保存了系统的当前状态,以便在休眠状态下恢复。如果你不使用休眠功能,如果因为C盘空间不足,可以考虑释放这个文件来腾出磁盘空间。
3707 0
|
3月前
|
C++ Windows
windows下内存检测工具
windows下内存检测工具
|
3月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
94 1
|
4月前
|
缓存 C# Windows
一款.NET开源的小巧、智能、免费的Windows内存清理工具 - WinMemoryCleaner
一款.NET开源的小巧、智能、免费的Windows内存清理工具 - WinMemoryCleaner
|
4月前
|
存储 安全 数据安全/隐私保护
3.2 Windows驱动开发:内核CR3切换读写内存
CR3是一种控制寄存器,它是CPU中的一个专用寄存器,用于存储当前进程的页目录表的物理地址。在x86体系结构中,虚拟地址的翻译过程需要借助页表来完成。页表是由页目录表和页表组成的,页目录表存储了页表的物理地址,而页表存储了实际的物理页框地址。因此,页目录表的物理地址是虚拟地址翻译的关键之一。在操作系统中,每个进程都有自己的地址空间,地址空间中包含了进程的代码、数据和堆栈等信息。为了实现进程间的隔离和保护,操作系统会为每个进程分配独立的地址空间。在这个过程中,操作系统会将每个进程的页目录表的物理地址存储在它自己的CR3寄存器中。当进程切换时,操作系统会修改CR3寄存器的值,从而让CPU使用新的页
55 0
3.2 Windows驱动开发:内核CR3切换读写内存
|
5月前
|
存储 安全 API
3.5 Windows驱动开发:应用层与内核层内存映射
在上一篇博文`《内核通过PEB得到进程参数》`中我们通过使用`KeStackAttachProcess`附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存区域通过这片区域可打通内核与应用层的隔离,此类功能的实现依附于MDL内存映射机制实现。
57 0
3.5 Windows驱动开发:应用层与内核层内存映射
|
5月前
|
安全 Windows
3.3 Windows驱动开发:内核MDL读写进程内存
MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中,每个进程都有自己独立的虚拟地址空间,不同进程之间的内存空间是隔离的。因此,要在一个进程中读取或写入另一个进程的内存数据,需要先将目标进程的物理内存映射到当前进程的虚拟地址空间中,然后才能进行内存读写操作。
41 0
3.3 Windows驱动开发:内核MDL读写进程内存
|
5月前
|
安全 PHP 网络虚拟化
windows内存取证-简单
作为 Security Blue 团队的成员,您的任务是使用 Redline 和 Volatility 工具分析内存转储。您的目标是跟踪攻击者在受感染计算机上采取的步骤,并确定他们如何设法绕过网络入侵检测系统“NIDS”。您的调查将涉及识别攻击中使用的特定恶意软件系列及其特征。此外,您的任务是识别和缓解攻击者留下的任何痕迹或足迹。
|
5月前
|
安全 文件存储 数据安全/隐私保护
windows内存取证-中等难度-下篇
承接上文,我们继续学习