我的体系结构类在确定页表大小方面遇到了一个HW问题。我看到这里已经有这么一个条目:
Determine page table size for virtual memory
但我很难把它应用到我的问题上。
据我所知,一般的方程式是:
(总页数)x(页的大小)
但当我计算的时候,数字就没有意义了。有人能帮我看看我做错了什么吗?
字节可寻址内存,48位虚拟空间,16 kB页大小(14位表示),
4GB物理内存(代表22位),以及每个页面的有效、脏、引用位
一个应用程序的表大小是多少?
总页数= 2^48 / 2^14 = 2^34
页面大小= 16 kB
总页码=(总页数)x(页面大小)=2^34x16 kB = 274877906944 kB?!
一些帮助将是非常感激的--很明显我做错了什么。
谢谢。
发布于 2014-10-27 15:17:52
将页与页表项混淆:
您希望将4GB物理内存映射到多个16 to的页面上。
所以你需要(4*10^6 / 16*10^3) = 250页(注)
每个地址都保存在一个页表条目中,它是一个32位整数,由页面的物理内存中的地址和有关该页面的一些修饰符/信息位组成。
每个进程至少需要一个页面表。在这里,它由250页表条目组成。每个页表条目的大小是一个32位(4B)号(随你怎么称呼它)。
因此,一个过程所需的总规模是:
250 * 4B = 1000 B= 1kB
为什么这种方法不是基于x86 MMU使用的分页模型使用的:
如您所述,一个单层分页机制的问题是,每个进程(无论多小)都需要:4GB/ 16 16=4* 10^6 B/16*10^3B= 0,25 * 1000 = 250页表条目。
250 *4字节(每项32位)= 1 kB /进程
看起来不多,但是这里使用了16个kB页面(例如,大多数x86系统使用4kb的页面,因此每个进程都需要1MB )。
这就是为什么x86使用一个两级分页过程,其中每个进程有1024个页面目录条目,每个条目都保存页面表的地址(其中包含1024个页面表条目)。因此,进程的最小分配内存为:4字节(页目录条目)+ 1024 *4字节(1024 32位页表条目),每个页表条目指向内存中的4kB物理页。
1024页目录条目*每个目录的1024页表条目* 4kB页= 4GB可寻址内存
虚拟地址大致由以下内容组成:
这意味着,即使您增加了单个页面的大小(从而减少了所需的页表条目的数量),您也需要更大的数量来描述偏移量。
https://stackoverflow.com/questions/26576808
复制相似问题