在虚拟地址中使用偏移量

Pra*_*dey 1 operating-system memory-management cpu-architecture

据我所知,CPU始终会生成一个虚拟地址,该地址由页码和页偏移量两部分组成。页号用于索引页表(相应的映射给出了RAM中帧的起始地址)。现在,请考虑以下问题。请考虑机器的字大小为4个字节,并且页面大小等于帧大小= 4096字节。

  1. 假设页号是4,偏移量是3。则逻辑存储器中的Page 4映射到虚拟存储器中的帧8。这意味着帧的起始地址为8。
  2. 现在,每个帧将包含4096/4 = 1024个字。偏移量是否意味着框架内的单词,因为机器总是一次获取一个单词?我的意思是说这意味着第8帧中的第三个单词吗?
  3. 是将特定字分配给CPU还是整个帧?如果是前者,那么为什么每个人都谈论框架和页面而不是文字的转移?
  4. 假设发生页面错误。这意味着特定页面不在内存中。这是否意味着映射的物理地址包含其他页面?在无效位为1的情况下,映射是否存在?

有人可以帮我整理一下吗?我一时似乎明白了,下一分钟,我陷入了迷宫。

Mar*_*oom 5

分页的关键在于它处理内存的“块”。
它是一种映射,一种功能,可将虚拟地址转换为物理地址,而不是逐个地址地转换。而是将连续虚拟地址的“块” 一起转换为现在物理地址的另一个连续 “块”。
您可以将其视为内存“块”的“翻译”或“混洗”。

改写记忆的“块”

“大块”的正确术语是page
如果尝试进行示例映射,则可以看到每个页面都包含一组地址,这些地址都具有特殊性:从虚拟到物理时,它们的低位不变。相反,高位是任意的。
地址值的这种二分法定义了“ 偏移”和“ 页数/帧号”
偏移量是地址值中不进行任何转换的部分。在4KiB页面中,有4096个地址,每个地址都有其偏移量,因此偏移量的大小为log 2(4096)= log 2(2 12)= 12 * log 2(2)= 12位。
简而言之,页面大小决定了偏移量大小。

必要将存储器分为页而不是字或字节,或者在另一种视图中,必须将地址分组以转换成页。
没有页面,用于翻译的元数据(用各种术语表示)将比正在翻译的元数据占用更多的内存!

由于定义方式,偏移量是相对于其页面/帧的:帧8中的偏移量1024(十六进制400h)表示地址8000h + 400h = 8400h;如果页面映射到帧12,则偏移1024在帧开始后仍为1024字节,即0c000h + 400h = 0c400h。

作为地址,偏移量通常表示字节,在体系结构中,字节不可寻址。但是,这不是标准约定,要知道偏移量是表示字还是字节(例如,帧0的偏移量10是字节40还是字节10),请查阅体系结构手册。第一部分通常致力于建立在本书中使用的术语。

分页发生在CPU访问内存之前,您可以将其视为高级进程。访问内存/总线的单元几乎不知道它,因此CPU会读取指令告诉其读取的数据(一个字,一个字节等)。
人们谈论移动页面是因为页面是可以描述最小单元
您可以将页面标记为不存在,但不能将其标记为单词。您可以将页面设为只读,但不能使一个单词成为页面。
如果需要映射(例如16个字节),则由于16个字节无法表征,因此仍需要映射整个页面。因此,我们不妨阅读整个页面。

当发生页面故障时,这意味着在页面表中的任何级别上都不存在所访问的页面。
这可能意味着各种各样的事情,从只对Present位进行了切换(页面仍然存在)到页面已被保存到磁盘并在内存中进行了零位存储这一事实。
由于映射函数是total,意味着每个值都是有效值,因此CPU需要一种方法来知道何时值无效。
Present位执行此操作:告诉CPU一定不要执行转换,而必须引发异常。
操作系统使用此异常来通知何时需要页面,它不需要将映射重新分配给另一个页面或将内存清零。
当人们说页面是删除它们意味着将其从映射中删除,所有现代OS还将页面归零,以防止信息泄漏到其他进程。

因此,如果未映射物理帧,则并不意味着另一个进程中的另一页正在对其进行映射,仅意味着无法访问该地址范围。
如上所述,OS这样做有很多原因,包括保护。