我已经被教导当CPU生成逻辑地址时,使用页表将其转换为物理地址,页表通常是在操作系统的存储空间中分配的连续数组。此数组的索引是虚拟地址的最高位(也称为页码)。
另外,我知道堆地址的逻辑地址是低的,而堆栈地址的逻辑地址是高的,因为它们以相反的方向增长,堆栈从0xffffffffffffffffff开始。
所以我的问题是,由于堆栈地址的页码数量很少但堆栈地址的页面数量非常高,因此CPU生成的页码(或页表中的索引)不是很重要但是非常高或非常低。然后如何在不创建非常大的页表的情况下索引页表。
此外,当页码大于限制(分配给进程的页数/帧数)时,我们需要保持进程的大小并引发分段错误。如果有效的页码不是连续的,那怎么办呢。
答案 0 :(得分:1)
所以我的问题是,因为堆地址的页码很少 但堆栈地址,页码(或索引)非常高 CPU生成的页表不是很重要但是非常 高或非常低。那么如何用它来索引页表而不用 创建一个非常大的页表。
CPU生成的是虚拟内存(虚拟意味着不是真实的),它与实际的物理内存之间存在无关系(也称为主内存)。 虚拟内存只不过是一个虚构连续内存块。
页面表(内存管理单元)的职责是处理这些虚拟地址并将它们转换为实际的物理地址 RAM(或主存储器)。
virtual page number i
可以映射到物理内存的frame number 2000
,下一个virtual page number i + 1
可以映射到物理内存的frame number 10000
。这就是分页的美妙之处,因为它允许non-contiguous memory allocation.
所以提出你的问题:如果页表非常大,那么就有一种名为multi-level page tables的机制,可以轻松解决大页表的问题。
此外,我们需要保持流程的规模并提高 页码大于限制时的分段错误( 分配给流程的页数/帧数)。如果这样做怎么办? 有效的页码不是连续的
首先,当您将分段作为非连续内存分配方案时,会出现分段错误。 分页和分段是两种不同的非连续内存分配方案。无效页码由与每个页表条目相关联的有效/无效位处理。