页表如何处理堆栈和堆内存地址?
我已经被告知,当CPU产生一个逻辑地址时,它会使用页表转换为物理地址,该页表通常是在操作系统内存空间中分配的连续数组。 此数组中的索引是虚拟地址(又名页码)的最高位。
另外,我知道堆地址的逻辑地址是低的,而堆地址的逻辑地址是高的,因为它们的堆栈方向相反,堆栈从0xffffffffffffffff开始。
所以我的问题是,由于堆地址的页码很低,堆栈地址的页码很高,CPU生成的页码(或页表中的索引)不是连续的,而是非常高或非常低。 那么它是如何用来索引页表而不创建一个非常大的页表的。
另外,当页数大于限制(分配给out process的页/帧数)时,我们需要维护进程的大小并引发分段错误。 如果有效页码不是连续的,这是如何完成的。
所以我的问题是,由于堆地址的页码很低,堆栈地址的页码很高,CPU生成的页码(或页表中的索引)不是连续的,而是非常高或非常低。 那么它是如何用来索引页表而不创建一个非常大的页表的。
CPU产生的是虚拟内存(虚拟手段不是真实的),它与实际的物理内存(也称为主内存) 没有任何关系 。 虚拟内存不过是一个虚构的连续大块内存。
页表(内存管理单元)负责处理这些虚拟地址,并将它们转换为RAM(或主存储器)的实际物理地址。
virtual page number i
可以被映射到物理存储器的frame number 2000
,并且下一个virtual page number i + 1
可以被映射到物理存储器的frame number 10000
。 这是Paging的美妙之处,因为它允许非连续的内存分配。
所以来到你的问题:如果页表非常大,那么就有一种称为多级页表的机制,它可以轻松解决大页表的问题。
另外,当页数大于限制(分配给out process的页/帧数)时,我们需要维护进程的大小并引发分段错误。 如果有效页码不是连续的,这是如何完成的
首先,分段错误发生在将分段作为不连续的内存分配方案时。 分页和分段是两种不同的非连续内存分配方案。 并且无效的页码被处理与每个页表项相关的有效/无效位。
链接地址: http://www.djcxy.com/p/14515.html上一篇: How does page table handle both stack and heap memory addresses?