32位物理页表分辨率

时间:2011-07-22 18:54:33

标签: windows memory x86 kernel

我在64位(x86-64)架构上以传统模式运行32位系统。创建新进程时,内核必须决定物理内存中实例化时所需的所有页面的位置(假设单个线程可能包含多个内存区域,如堆栈,堆等)

我假设内核保留了正在使用的物理RAM帧的某种动态列表,以及物理内存的所有区域的静态列表,这些区域已由设备用于使用内存的系统 - 映射IO。这是对的吗?

此外,我还读到32位Windows系统的物理内存限制为4GB(可能是由于最小地址总线假设),因此,即使系统可能安装了超过4 GB的物理内存, 32位内核只会分配4GB范围内的地址。

有关特定情况的低级别操作系统实施的具体信息很难在网上找到。任何人都可以验证这些陈述,并可能将我推荐给我可以获得更多信息的来源吗?

感谢您的考虑。

2 个答案:

答案 0 :(得分:0)

32位系统只能直接寻址4gig(2 ^ 32 = 4gig)。有PAE次黑客攻击,让系统拥有超过4gig的物理内存,但没有任何进程可以拥有超过4gig的内存。同样,即使你有4gig的ram,你也看不到超过3.5gig的实际可用空间 - 有些是为内存映射硬件设备保留的,例如你的视频RAM。

有关处理物理 - 虚拟内存映射的一种方法,请查看TLB

答案 1 :(得分:0)

  

当创建新进程时,内核必须决定物理内存中实例化时所需的所有页面的分配位置

为什么必须在流程创建时决定?实际上,它只是按需创建它们 - 它只是创建PTE(即“此地址范围有效”,但页面以任何方式支持);当流程首次开始执行时,它会立即页面错误

但是页面错误是什么?所发生的是,首先CPU读取TLB以查看它是否具有地址< =>帧映射。当失败时,它会引导PTE寻找匹配的条目。如果未找到任何条目,或者条目指示该页面未被备份,则会生成页面错误。这意味着发生CPU异常并且CPU立即跳转到预定义的地址。然后内核做的第一件事是保存CPU上下文(即故障位置的寄存器),然后调度到页面错误处理程序。

当发生页面错误时,Mm(NT中的内存管理器)将读取其自己的数据结构中的映射(请记住所有PE映像都是内存映射文件),并在那时确定哪个物理帧(即'将要使用的真实内存()。

一旦页面错误得到处理,页面错误就会恢复已保存的CPU上下文,并跳回原来的状态,然后重试出现故障的指令。

你是正确的,32位操作系统只会使用4GB的地址空间( RAM!不要忘记那些内存映射的设备和文件!),处理器将在32位模式并将PTE解释为32位(请记住,AMD64长模式会增加额外级别的页表并将地址空间扩展到48位)。