内存管理中的虚拟地址到物理地址翻译

在虚存映射中,建立了文件到虚存区的映射,那么我们知道数据都是要放到物里内存中才能执行的,为了完成从虚拟内存到物理内存的映射,引入了请页机制。同虚拟存储器一样,物理存储器也被分割为物理页,在X86下这个大小为4K。为了将虚拟页面同物理页面关联起来操作系统使用了页表这个数据结构,它是存在于物理内存中的。对于页表,为了帮助理解,我们可以先把它简单的看做是一个有两列的表格,左边的是虚拟内存的页号,右边是物理内存的页号。下面这图是一个虚拟地址到物理地址的转换的描述:

在图中有个页表基址寄存器,这个是存储在每个进程的mm_struct中的一个字段,叫pgd,它指明了这个进程的页表在存储器中的地址,要是把页表看作是个数组的话,那么它就相当于是个数组首地址。上面说了页大小为4K,所以对一个页来说地址中的低12位是被屏蔽的,这12位就是地址中的偏移量,我们在上图看到,地址中的偏移量是不经过任何操作直接从虚拟地址复制到物理地址中的。
在上面也出现了一个有效位,它主要是检测我们当前需要转换的虚拟页面在存储器中是否有相应的物理页面与它对应,若有则进行查找,否则就会引发一个缺页异常。

缺页异常
当某个可执行文件映像映射到进程用户空间中并开始执行时,因为只有很少一部分虚拟页面装入到了物理内存,可能会遇到所访问的数据不在物理内存,就是上面的有效位为0的情况。这时,处理器将向linux报告一个页故障及其对应的故障原因。
当出现一个缺页异常时,这个异常会导致控制转移到内核的缺页处理程序,这个程序将会执行以下一些步骤:
1)、内核会先判断这个引发异常的地址A是否合法,也就是说A在某个区域中吗,若不再则引发一个段错误,从而终止这个进程。
2)、试图进行的存储器访问是否合法,也就是说我们是否对一个只读的区域执行了写操作。若是则执行一个保护异常。
当内核知道我们这个缺页是因为对合法的虚拟地址进行合法的操作造成的,它是这样来处理一个缺页的:选择一个牺牲页面,如果这个牺牲页面被修改过,那么就将它交换出去,还入新的页面并更新页表。当缺页处理程序返回时,CPU重新启动引起缺页的指令,这条指令将再次发送地址A到MMU。这次,就能正常的翻译地址A而不会产生缺页中断了。

对于上面的一个过程是在一级页表中完成的,实际上都是多级页表(2级或者3级等),其实地址翻译的过程还是一样的,下面这个图就是对多级页表的一个翻译过程:
总之就是把一个虚拟地址分为好几段,分别作为一级、二级、、K级的索引,当然别忘了我们的PGD,他在程序运行的过程中是保存在CR3这个寄存器中的。
在虚拟页到物理页的翻译过程中最重要的数据结构就是页表了,是它打通了虚拟到物理的通道,页表存在于主存中,进程只需要记住它的首地址。

阅读(1226) | 评论(0) | 转发(4) |
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在操作系统虚拟地址是由CPU生成的。当程序引用虚拟地址时,操作系统会将其翻译物理地址,然后才能访问内存的数据。以下是获取物理地址的方式: 1. 分页机制:操作系统将内存分成固定大小的页,将虚拟地址映射到物理地址。当程序访问虚拟地址时,CPU会将其分解成页号和页内偏移量,然后在页表查找对应的物理页框号,最后计算出物理地址。 2. 段页式机制:将虚拟地址分成段号和页内偏移量,每个段对应一个页表,页表记录了虚拟页号和物理页框号的映射关系。当程序访问虚拟地址时,CPU会先查找段表,然后再在对应的页表查找物理页框号,最后计算出物理地址。 3. TLB(Translation Lookaside Buffer)缓存:TLB是CPU内部的一个高速缓存,用于存储最近访问过的虚拟地址和对应的物理地址的映射关系。当程序访问虚拟地址时,CPU会先查找TLB缓存,如果命则直接使用对应的物理地址,否则再进行页表查找。 ### 回答2: 虚拟地址获取物理地址的方式主要有两种方法:分段和分页。 在分段方式虚拟地址由两部分组成:段号和段内偏移。首先,通过段号可以找到对应的段表项。段表项保存了该段的物理起始地址和长度信息。然后,将段表项的物理起始地址与段内偏移相加,即可得到物理地址。 在分页方式虚拟地址由两部分组成:页号和页内偏移。首先,通过页表找到对应的页表项。页表项保存了该页的物理框号。接着,将物理框号与页内偏移相加,即可得到物理地址。 这两种方式的主要区别在于管理的粒度不同。分段方式是按照不同的段来划分内存空间,适用于具有不同功能或权限要求的程序。而分页方式是按照相同大小的页来划分内存空间,适用于多个程序或进程并发执行的情况。 值得注意的是,虚拟地址物理地址的映射是由操作系统负责管理的。操作系统在启动时会建立相应的页表和段表,并根据程序的需求进行合适的地址转换。在多任务环境下,每个进程都有自己的虚拟地址空间,这样可以提高系统的资源利用率和安全性。 总之,虚拟地址获取物理地址的方式主要有分段和分页,而具体的地址映射由操作系统负责管理。通过合理的地址映射机制,可以确保进程的正常运行并保护系统的安全性。 ### 回答3: 在计算机系统虚拟地址是指由操作系统分配给进程的地址空间,而物理地址是指内存实际的存储置。虚拟地址获取物理地址的方式主要通过页表机制实现。 页表是一种数据结构,用于实现虚拟地址物理地址之间的映射关系。操作系统维护着一个全局的页表,其记录了每个进程的虚拟地址物理地址之间的映射关系。 当进程产生一个虚拟地址时,操作系统通过虚拟地址的高来查找到对应的页表项。页表项包含了虚拟地址物理地址的映射关系。 通过查找到对应的页表项,操作系统可以得知虚拟地址对应的物理页框号。接着,根据页框号和虚拟地址的偏移量可以计算出物理地址。 具体地,在计算机系统,由于内存访问的粒度是以页面为单,因此操作系统虚拟地址物理地址划分为页面大小的块。一般情况下,一个页面的大小为4KB。 虚拟地址的高表示页表索引,操作系统根据这个索引找到对应的页表项。页表项的页框号表示虚拟地址对应的物理页框号。 虚拟地址的低表示页内偏移量,通过与页面大小取模,可以得到在物理页框的具体置,从而计算出物理地址。 综上所述,虚拟地址获取物理地址的方式是通过页表机制实现的,根据虚拟地址的高查找页表项,再根据页表项的信息计算出物理地址。这种方式使得进程可以使用虚拟地址进行内存访问,而无需关心具体的物理地址,提高了系统的灵活性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值