在虚拟地址中使用偏移量

时间:2016-11-28 16:45:36

标签: memory-management operating-system cpu-architecture

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

  1. 假设页码为4且偏移量为3.然后逻辑内存中的第4页映射到虚拟内存中的第8帧。这意味着帧的起始地址是8。
  2. 现在,每个帧将包含4096/4 = 1024个字。偏移量是否意味着帧内的单词,因为机器总是一次取一个单词?我的意思是它是指第8帧中的第3个单词吗?
  3. 特定字是给予CPU还是整个帧?如果是前者,那么为什么每个人都谈论框架和页面而不是文字的转移呢?
  4. 假设发生页面错误。这意味着特定页面不在内存中。这是否意味着映射的物理地址包含其他一些页面?当无效位为1时,映射甚至存在于这种情况下。
  5. 有人能帮我清理一下吗?有一刻我似乎明白了,接下来,我进入迷宫。

2 个答案:

答案 0 :(得分:5)

分页的关键是它处理内存的“块” 它是一个映射,一个函数,它将虚拟地址转换为物理地址,但不是逐个地址转换。相反,连续虚拟地址的“块”被一起转换为另一个连续“块”,现在是物理地址。
你可以把它想象成“记忆”的“翻译”或“洗牌”。

Shuffing of "chunks" of memory

“chunk”的正确用语是 page 如果尝试进行样本映射,您可以看到每个页面都包含一组具有特性的地址:当从虚拟传递到物理时,它们的低位不会更改。相反,高位是任意的 地址值的这种二分法定义了偏移页面/帧编号。 偏移量是地址值中不进行任何转换的部分。 在4KiB的页面中有4096个地址,每个地址都有其偏移量,因此偏移量的大小为 log 2 (4096)= log < sub> 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个字节不可表征。所以我们不妨阅读整整一页。

发生页面错误时,表示访问的页面在页面表的任何级别都不存在。
这可能意味着各种各样的事情,从现在的位被简单切换(页面仍在那里)到页面已经保存到磁盘并在内存中归零的事实。 由于映射函数是 total ,意味着每个值都是有效值,因此CPU需要知道值何时无效。
Present位执行此操作:告诉CPU不得执行转换,并且必须引发异常 操作系统使用此异常通知何时需要页面,不需要将映射重新分配给另一个页面或将内存归零。
当人们说某个页面被删除时,他们意味着它已从映射中删除,所有现代操作系统也会将页面归零,以防止信息泄露给其他进程。

因此,如果未映射物理帧,则并不意味着另一个进程中的另一个页面正在映射它,它只是意味着无法访问该范围的地址。
如上所述,操作系统有很多原因可以做到这一点,包括保护。

答案 1 :(得分:1)

你有点倒退。操作系统为每个进程定义逻辑地址空间。逻辑地址空间被分为称为PAGES的内存单元。

操作系统将地址页面逻辑映射到物理页面框架或辅助存储器如果操作系统将页面映射到辅助存储器,则使用虚拟内存。

在所有日子里,所有进行逻辑内存转换的系统都会对二级存储进行虚拟内存映射。这就是虚拟内存转换和逻辑内存转换这两个术语经常混淆的原因。如今,没有虚拟内存的逻辑翻译变得越来越普遍。

通过进程的所有地址访问都是逻辑地址。处理器将逻辑地址转换为页面帧。如果逻辑页面存在但映射到辅助存储,则访问该页面会触发页面错误。操作系统必须处理故障,将逻辑/虚拟页面重新映射到物理页面框架;将数据从二级存储加载到页面框架;并重新启动说明。

  
      
  1. 假设页码为4且偏移量为3.然后逻辑内存中的第4页映射到虚拟内存中的第8帧。这意味着帧的起始地址是8。
  2.   

这没有任何意义。逻辑页面在映射到辅助存储时是虚拟的。如果页码为4,则第4个逻辑页面可以:

a)根本没有映射(访问冲突)

b)映射到物理页面框架

c)映射到辅助存储(虚拟内存)

  
      
  1. 现在,每个帧将包含4096/4 = 1024个字。偏移量是否意味着帧内的单词,因为机器总是一次取一个单词?我的意思是它是指第8帧中的第3个单词吗?
  2.   

在几乎所有(如果不是全部)当前处理器中都没有记忆词;只有字节。系统总线获取内存和&#34;字大小&#34;公共汽车可以(通常是)不同于&#34;字号&#34;处理器。

  
      
  1. 特定字是给予CPU还是整个帧?如果是前者,那么为什么每个人都谈论框架和页面而不是文字的转移呢?
  2.   

该过程看到与正在执行的指令相关的大小的传输。操作数大小可以大于或小于机器字。总线将数据传输到内存,该大小通常与机器的字大小不同。

  

假设发生页面错误。这意味着特定页面不在内存中。这是否意味着映射的物理地址包含其他一些页面?当无效位为1时,映射甚至存在于这种情况下。

我给出了上面逻辑页面映射的三种可能性。如何指出这些是特定于系统的。一些系统使用2位来指示a,b或c。其他人使用一位表示(b)并要求操作系统确定它是(a)还是(c)。

是否触发页面错误取决于页面表的状态。

通常页面错误意味着页面框架不在内存中。但是,物理页面框架通常可能在内存中但不在页面表中映射(软页面错误)。 (当操作系统有未映射的页面框架以释放它们但尚未重新分配它们时会发生这种情况。)在这种情况下,操作系统只需要更新页面表以指向页面框架并重新启动指令(无需从二级存储加载。)