首页 > 系统相关 >win32汇编-80386的内存分页机制

win32汇编-80386的内存分页机制

时间:2023-09-24 22:35:05浏览次数:47  
标签:分页 80386 win32 物理地址 地址 内存 线性

 

读者可以注意到,在实模式下寻址的时候,“段寄存器+偏移地址”经过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址。而保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”。那么,线性地址就是物理地址吗?
答案可能是“是”,也可能是“不是”,这取决于80386的内存分页机制是否被使用。

在单任务的DOS系统中, 一个应用程序可以使用所有的空闲内存。程序退出后, 操作系统回收所有的碎片内存并且合并成一个大块内存继续供下一个程序使用。内存合并过程中的一个极端情况是当系统中有多个TSR程序时, 早装入内存的TSR被卸载后, 后装入的TSR 会留在内存的中间部位,把空闲内存隔成两个区域。这时应用程序使用的最大内存块只能是这两块内存中较大的一块,无法将它们合并使用。
对于一个多任务的操作系统,内存的碎片化是不能容忍的。否则,经过一段时间后,即使空闲内存的总和很大,也可能出现任何一片内存都小到无法装入执行程序的地步。所以多任务操作系统中碎片内存的合并是个很重要的问题。

80386处理器的分页机制可以很好地解决这个问题。80386处理器把4KB大小的一块内存当做一“页”内存,每页物理内存可以根据“页目录”和“页表”,随意映射到不同的线性地址上。这样,就可以将物理地址不连续的内存的映射连到一起,在线性地址上视为连续。在80386处理器中,除了和CR3寄存器(指定当前页目录的地址)相关的指令使用的是物理地址外,其他所有指令都是用线性地址寻址的。

是否启用内存分页机制是由80386处理器新增的CR0寄存器中的位31(PG位)决定的。如果PG=0,则分页机制不启用,这时所有指令寻址的地址(线性地址)就是系统中实际的物理地址;当PG=1的时候,80386处理器进入内存分页管理模式,所有的线性地址要经过页表的映射才得到最后的物理地址。

内存分页管理只能在保护模式下才可以实现,实模式不支持分页机制。但不管在哪种模式下,所有寻址指令使用的都是线性地址,程序不用关心数据最后究竟存放在物理内存的哪个地方。
页表规定的不仅是地址的映射,同时还规定了页的访问属性,如是否可写、可读和可执行等。比如把代码所在的内存页设置为可读与可执行,那么权限不够的代码向它写数据就会引发保护异常。利用这个机制可以在硬件层次上支持虚拟内存的实现。

如图,页表可以指定一个页面并不真正映射到物理内存中。这样,访问这个页的指令会引发页异常错误。这时,处理器会自动转移到页异常处理程序中去。操作系统可以在异常处理程序中将硬盘上的虚拟内存读到内存中并修改页表重新映射,然后重新执行引发异常的指令。这样指令可以正常执行下去。

 

 

 

 

 

 

 

 

标签:分页,80386,win32,物理地址,地址,内存,线性
From: https://www.cnblogs.com/liming19680104/p/17726843.html

相关文章

  • crash —— 获取系统内存使用统计数据
    crash>kmem-iPAGESTOTALPERCENTAGETOTALMEM197646761754GB----FREE33983015129.6GB17%ofTOTALMEMUSED163663746624.3GB82%ofTOTALMEMSHARED139137......
  • crash —— 获取物理内存布局信息
    crash>mach-mPHYSICALADDRESSRANGETYPE0000000000000000-0000000000001000E820_RESERVED0000000000001000-000000000006e000E820_RAM000000000006e000-0000000000070000E820_RESERVED0000000000070000-00000000000a0000E820_RAM0......
  • Go指针探秘:深入理解内存与安全性
    Go指针为程序员提供了对内存的深入管理能力,同时确保了代码的安全性。本文深入探讨了Go指针的基础概念、操作、深层理解及其特性与限制。通过深入了解其设计哲学和应用,我们可以更好地利用Go的强大功能。关注公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作......
  • win32汇编-CR3寄存器和PDBR寄存器
     CR3寄存器是x86架构中的一种控制寄存器,用于存储页目录表的物理地址(PhysicalAddress)。在x86架构的操作系统中,使用分页机制将虚拟地址映射到物理地址。为了实现这种映射,需要使用页表和页目录表来管理地址转换。CR3寄存器存储了页目录表的物理地址,通过改变CR3寄存器的值,可以实......
  • 使用mtrace追踪JVM堆外内存泄露
    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明。简介在上篇文章中,介绍了使用tcmalloc或jemalloc定位native内存泄露的方法,但使用这个方法相当于更换了原生内存分配器,以至于使用时会有一些顾虑。经过一些摸索,发现glibc自带的ptmalloc2分配器,也提供有追踪内......
  • 内存对齐
    1、内存对齐是什么?​ 计算机的内存就好像一个很大的数组,访问内存的时候,看似是可以从任何地址开始,但是实际上为了简化形成处理器和内存系统之间的接口设计,不同类型的数据会按照一定的规则在空间上排列,并不是按照顺序一个接着一个排放,这种排放方式就是内存对齐。2、需要内存对齐的......
  • windows系统编程(win32)
    一、编程环境操作系统:windows10-1809(17763.1557)-x64;windowskits:C:\ProgramFiles(x86)\WindowsKits\10\Include\10.0.19041.0\sharedvisualstudio2019:C:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Community\VC\Tools\MSVC\14.29.30133\include......
  • JS深入学习笔记 - 第三章.变量作用域与内存
    1.原始值和引用值ECMScript变量包含两种不同类型是数据:原始值和引用值。原始值:最简单的数据。有6中原始值:Undefined、Null、Boolean、Number、String和Symbol。原始值是按值访问。引用值:由多个值构成的对象。三大引用类型:1.object2.Array类型3.Function类型。引用值是保存在......
  • 使用qemu来dump虚拟机的内存,然后用crash来分析
    场景如果虚拟机没有开启kdump,或者卡死了,那么可以进入qemu的monitor模式将虚机的内存保存到文件中,然后使用crash工具进行分析。示例启动虚拟机,然后按ctrl+ac进入monitor,查看帮助(qemu)helpdump-guest-memorydump-guest-memory[-p][-d][-z|-l|-s|-w]filename[beginl......
  • openGauss学习笔记-77 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT特性及
    openGauss学习笔记-77openGauss数据库管理-内存优化表MOT管理-内存表特性-MOT特性及价值本节介绍了openGauss内存优化表(Memory-OptimizedTable,MOT)的特性及价值。77MOT特性及价值MOT在高性能(查询和事务延迟)、高可扩展性(吞吐量和并发量)以及高资源利用率(某些程度上节约成本)方面......