页表如何处理堆栈和堆内存地址?

时间:2017-11-27 00:31:40

标签: operating-system segmentation-fault paging heap-memory stack-memory

我已经被教导当CPU生成逻辑地址时,使用页表将其转换为物理地址,页表通常是在操作系统的存储空间中分配的连续数组。此数组的索引是虚拟地址的最高位(也称为页码)。

另外,我知道堆地址的逻辑地址是低的,而堆栈地址的逻辑地址是高的,因为它们以相反的方向增长,堆栈从0xffffffffffffffffff开始。

所以我的问题是,由于堆栈地址的页码数量很少但堆栈地址的页面数量非常高,因此CPU生成的页码(或页表中的索引)不是很重要但是非常高或非常低。然后如何在不创建非常大的页表的情况下索引页表。

此外,当页码大于限制(分配给进程的页数/帧数)时,我们需要保持进程的大小并引发分段错误。如果有效的页码不是连续的,那怎么办呢。

1 个答案:

答案 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的机制,可以轻松解决大页表的问题。

  

此外,我们需要保持流程的规模并提高   页码大于限制时的分段错误(   分配给流程的页数/帧数)。如果这样做怎么办?   有效的页码不是连续的

首先,当您将分段作为非连续内存分配方案时,会出现分段错误分页分段是两种不同的非连续内存分配方案。无效页码由与每个页表条目相关联的有效/无效位处理。