精华内容
下载资源
问答
  • 分页内存管理——虚拟地址到物理地址的转换

    万次阅读 多人点赞 2018-08-10 23:30:57
    此篇博客内容在于着重帮助读者明白在分页内存管理下,虚拟地址物理地址转换计算是怎么进行的。 有关分页内存管理的其他知识请事先参阅有关资料。^_^ 一、在计算之前需要了解如下知识: 1.对每个程序而言,...

    前言:

    此篇博客内容在于着重帮助读者明白在分页内存管理下,虚拟地址和物理地址转换计算是怎么进行的。

    有关分页内存管理的其他知识请事先参阅有关资料。^_^

     

    一、在计算之前需要了解如下知识: 

     

     1.对每个程序而言,就好像自己独占了内存空间从0到极限的计算机。

    虚拟地址都是以0开始到某个上限结束。这是因为某个程序在何种硬件设备的机器上运行并不能事先确定(因为写出来的程序一般都会在很多计算机上运行,而每台计算机的内存占用情况事先肯定无法知晓),操作系统自然不可能对症下药地发出对于某

     台机器的物理主存地址。因此,指令里面的地址是程序空间(虚拟空间)的虚拟地址(程序地址)。所以当 程序真正运行起来的时候,每个虚拟地址必然要对应着一个物理地址(实际存在)。既然要对应,那就比如存在某种对应机制。
     

     2.分页内存管理机制将虚拟内存和物理内存都分成大小一样大的部分,我们称为页,然后按页进行内存分配.

    一般页的大小有4KB、8KB、16KB。在该管理机制下内存分配单位化而且不需要空闲连续在一起即可使用

    (比如第四页和第8页都空闲则可以组合起来给一个程序使用,但在分页内存管理发明之前是不可以的,因

     为两段空间不连续,至于为什么~~~~~~此处不予解释,需要了解的同学可以参阅相关资料。)

     3.虚拟地址的页号表示和物理地址页号表示是从0开始的。(比如虚拟地址的第1页前面还有第0页,这个对理解计算非常重 要)。

    4.理解了上面几点知识就可以尝试理解如下图表:(了解页表是什么即可。)

     

    通过页表我们就可以发现,每个虚拟页面号都对应着一个物理页面号,比如虚拟页面号是1,查询该表

    我们就可以知晓虚拟页面号1对应的物理页面号在哪里。之所以有这个表存在,就是因为我们使用的物理

    内存是不连续的(参考知识点②)。

     

     

    现在直接上题:

          

    题目给出了虚拟地址:0010 0000 0000 0100

    第一步:
    由页面大小为4KB可以得出页内偏移值为12位,也就是0010 0000 0000 0100,前面四位为页面号,
    即 0010 0000 0000 0100,由此我们可以知道虚拟页面为2。

     

    可能到这里有不少读者会困惑为什么是这样子计算,我以十进制数做说明。

    假设一个页面大小是10000KB,已知某个虚拟地址为26000,我们就可以知道这个地址是  虚拟页面2的起始地址+6000  

    后的一个地址。(虚拟页面0、虚拟页面1对应了前20000个地址),同理二进制数也这么看。

    此处还要注意的一点是:1KB=2^10 B=1024B  而不是1KB=1000B。

     

     

    第二步:
    知道了虚拟地址对应的虚拟页面是2后我们就可以查询页表,发现虚拟页面2对应的物理页面是110,

    所以我们可以计算出所求虚拟地址对应的物理地址为:

    110 0000 0000 0000(页面110的物理首地址)+100(偏移量)=110 0000 0000 0100

     

     

     

    &补充题目(一道笔试题)

    逻辑地址0对应的页为0 查询页表可知虚拟页0对应的物理页为2,

    所以物理页的首地址是2×4×2^10=8192

    再加上偏移量0 得出物理地址为8192+0=8192 所以选A。

     

    注明:

      物理地址是从0开始标注的 ,

      假如一个页大小为16,

      那么第0页地址为0~15

      所以第1页首地址为16,也就是1×16=16

      所以第2页首地址为32,也就是2×16=32,

      以此类推。

             

    展开全文
  • Linux 虚拟地址到物理地址转换

    千次阅读 2019-03-08 13:58:14
    CPU通过地址来访问内存中的单元,地址虚拟地址物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传CPU芯片的外部地址...

    Table of Contents

    概念

    地址转换过程


    概念

    虚拟地址和物理地址的概念 
        CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA),如下图所示。

                                            

                                                                                 物理地址示意图

     

    如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址,如下图所示。

                                              

                                                                           虚拟地址示意图
     

    虚拟内存地址和物理内存地址的分离,给进程带来便利性和安全性。虚拟地址必须和物理地址建立一一对应的关系,才可以正确的进行地址转换。

    记录对应关系最简单的办法,就是把对应关系记录在一张表中。为了让翻译速度足够地快,这个表必须加载在内存中。不过,这种记录方式惊人地浪费。

    因此,Linux采用了分页(paging)的方式来记录对应关系。所谓的分页,就是以更大尺寸的单位页(page)来管理内存。在Linux中,通常每页大小为4KB。如果想要获取当前树莓派的内存页大小,可以使用命令:

    baiheng@baiheng-OptiPlex-5055-Ryzen-CPU:~$ getconf PAGE_SIZE
    4096
    

    地址转换过程

    32bit 分页机制下虚拟地址是由32bit组成的,常规4KB分页,32位的虚拟地址被分成3个域。

    Directory(目录)Table(页表)Offset(偏移)
    最高10位中间10位最低12位

    具体的地址转换过程,文字描述太累,看图直观一些:

                                      

     

    依据以下步骤进行转换:

    1. 从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);
    2. 根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。
    3. 根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;
    4. 将页的起始地址与线性地址中最后12位相加,得到最终我们想要的葫芦;

    这个转换过程,应该说还是非常简单地。

    前面说了二级页管理架构,不过有些CPU,还有三级,甚至四级架构,Linux为了在更高层次提供抽像,为每个CPU提供统一的界面。提供了一个四层页管理架构,来兼容这些二级、三级、四级管理架构的CPU。这四级分别为:

    • 页全局目录PGD(对应刚才的页目录)
    • 页上级目录PUD(新引进的)
    • 页中间目录PMD(也就新引进的)
    • 页表PT(对应刚才的页表)。
       

    整个转换依据硬件转换原理,只是多了二次数组的索引罢了,如下图:

                                      Snap2.jpg

    展开全文
  • 虚拟地址到物理地址的映射

    千次阅读 2018-03-07 19:17:54
    CPU通过地址来访问内存中的单元,地址虚拟地址物理地址之分,如果CPU没有MMU(Memory Management Unit, 内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传CPU芯片的外部地址...

    虚拟地址和物理地址
    =========================================

        CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit, 内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将
    直接传到CPU芯片的外部地址引脚上,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,
    这称为物理地址(Physical Address, 以下简称PA),如下图所示:
    图1. 物理地址示意图



        如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address, 以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将
    虚拟地址映射成物理地址,如下图所示:
    图2. 虚拟地址示意图



        MMU将虚拟地址映射到物理地址是以页(Page)为单位的,对于32位CPU通常一页为4K。例如,虚拟地址 0xB7001000~0xB7001FFF是一个页,可能被MMU映射到物理地址0x2000~0x2FFF, 物理内存中的一个物理页面也称为一个页框(Page Frame)

        Datasheet中介绍各种寄存器时,所附带的地址就是物理地址。

        既然虚拟地址最终要转换为物理地址,那么为何还需要虚拟地址呢?
          虚拟地址提供了权限检查功能:比如我们设置虚拟地址和物理地址之间的映射关系时,可以设置某块地址是只读的,只写的,只有CPU处于管理模式时才能访问等。这些功能可以让系统的内核,用户程序的运行空间相互独立:用户程序即使出错,也无法破坏内核;用户程序A崩溃了,也无法影响到用户程序B。

     

    当开启分段分页机制时,典型的x86寻址过程为

     

                 

            内存寻址的工作是由Linux内核和MMU共同完成的,其中Linux内核负责cr3,gdtr等寄存器的设置,页表的维护,页面的管理,MMU则进行具体的映射工作。

    展开全文
  • 页表就是用于将虚拟地址转换为物理地址的转换关系表。访问虚拟地址时,计算机通过页表找到对应的实际物理地址访问。 我们在上一节介绍了内存管理模块概图, 怎么完成从pgd page的转化呢? linux 内核code是...

    ARM32的页表
    这里写图片描述
    页表就是用于将虚拟地址转换为物理地址的转换关系表。访问虚拟地址时,计算机通过页表找到对应的实际物理地址访问。
    我们在上一节介绍了内存管理模块概图,
    这里写图片描述
    怎么完成从pgd 到 page的转化呢?
    linux 内核code是通过follow_page来完成的,原型如下:

    static inline struct page *follow_page(struct vm_area_struct *vma,
            unsigned long address, unsigned int foll_flags)

    主要分成2步:
    1. 由虚拟地址vaddr通过查询页表找到pte;
    2. 由pte找出页帧号pfn,然后在mem_map[]中找到相应的struct page结构。

    这2步可以细化为如下几步:
    a. vma得到其所属的mm;
    b. mm->pgb(进程页表pgb的起始位置)
    c. mm->pgb 和 address 得到 address对应的pgd

    #define PGDIR_SHIFT     21
    /* to find an entry in a page-table-directory */
    #define pgd_index(addr)     ((addr) >> PGDIR_SHIFT)
    
    #define pgd_offset(mm, addr)    ((mm)->pgd + pgd_index(addr))

    d. pgd得到pte
    在ARM页表中,无pud和pmd,如下代码中的pmd就是步骤c中得到的pgd.

    ptep = pte_offset_map_lock(mm, pmd, address, &ptl);
    #define pte_offset_map_lock(mm, pmd, address, ptlp) \
    ({                          \
        spinlock_t *__ptl = pte_lockptr(mm, pmd);   \
        pte_t *__pte = pte_offset_map(pmd, address);    \
        *(ptlp) = __ptl;                \
        spin_lock(__ptl);               \
        __pte;                      \
    })
    #define pte_offset_map(pmd,addr)    (__pte_map(pmd) + pte_index(addr))

    e. pte得到pfn

    unsigned long pfn = pte_pfn(pte);
    #define pte_pfn(pte)        ((pte_val(pte) & PHYS_MASK) >> PAGE_SHIFT)

    f. pfn得到page

    page = vm_normal_page(vma, address, pte);
    展开全文
  • 与其说虚拟地址,倒不如说内核给程序(代码段、数据段)提供了统一的访问模式(抽象出统一的访问模式)基址加偏移量(这也是内存的分层次的断页管理模式)。所以所有程序的编码你可以从假设的“0”基址开始开始编程,...
  • MMU的主要作用:虚拟地址到物理地址的转换;访问权限控制;设置虚拟存储空间的缓冲。 虚拟存储器:程序一般存于掉电不丢失的硬盘中,但是硬盘读写速度慢。所以系统上电后一般只在ROM中完成小部分硬件初始化程序,并...
  • x86虚拟地址到物理地址的映射学习

    千次阅读 2014-09-27 11:08:54
    第一步从虚拟地址到线性地址,第二步从线性地址物理地址。 第一步从段描述符表描述的段基址加上段偏移生成线性地址。 IA32中线性地址高10位为页目录索引,通过此找到页表,线性地址中间10位为页表项索引,通过...
  • 对于这些地址,内核通过宏__pa()找到这些虚拟地址对应的物理地址。或者通过__va()找到物理地址对应 的虚拟地址。 arch/arm64/include/asm/memory.h #define __pa(x) __virt_to_phys((unsigned long)(x)) #define ...
  • 虚拟地址到物理地址的转换

    千次阅读 2017-01-04 14:22:37
  • 虚拟地址到物理地址的转换步骤

    千次阅读 2020-08-24 14:52:14
    已知一个虚拟地址0x01AF5518, 则转换的过程如下: 注意: 这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况 1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:  -> 0000 0001...
  • 说明: GDT:全局描述符表 LDT:局部描述符表 TI:标志位,为0表示描述符在GDT,为1表示描述符在LDT
  • 虚拟地址到物理地址有两种方式:第一、virt_to_phy() 也就是: 虚拟地址 - 3G ; 第二种是通过页表查询的方式; 疑问: 1. 什么时候使用第一种方式,什么时候采用第二种方式? 2. 这两种会不会产生冲突,即两种...
  • MIPS虚拟地址到物理地址转换过程

    千次阅读 2014-04-06 21:07:08
    开启虚拟地址使能的系统上,CPU发起的访问最初都是虚拟地址VA,而真正从物理主存中获取内容需给内存控制器的地址物理地址PA,所以在CPU发起访问后,需要一系列的动作完成VAPA的转换,这需要OS和硬件协同来完成。...
  • 虚拟地址物理地址及其映射

    千次阅读 2020-03-02 15:46:55
    其实之前我看过这个问题,据我理解的,当时是这么回答的“进程在运行的时候,操作系统都为其分配一个4GB的地址空间,即所谓的虚拟地址空间,一般情况下,当我们的程序很大的时候,实际的物理内存根本不能满足我们的...
  • 内存管理中的虚拟地址到物理地址翻译  在虚存映射中,建立了文件虚存区的映射,那么我们知道数据都是要放物里内存中才能执行的,为了完成从虚拟内存到物理内存的映射,引入了请页机制。同虚拟存储器...
  • 已知一个虚拟地址0x01AF5518, 则转换的过程如下:  注意: *这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况* 1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:  -&...
  • 虚拟地址空间映射到物理地址空间

    千次阅读 2018-09-07 09:06:45
    虚拟地址空间映射到物理地址空间参考如下  当处理器读或写入内存位置时,它会使用虚拟地址。作为读或写操作的一部分,处理器将虚拟地址转换为物理地址。通过虚拟地址访问内存有以下优势:  程序可以使用一系列...
  • 1、虚拟地址物理地址之间的映射是以页(4KB)为单位进行映射的; 2、每一个进程中都有一个进程控制块(PCB),里面包含了一些进程的信息(页目录,状态,句柄表,ID,PID……); 3、映射过程(32位系统下): ...
  • linux虚拟地址物理地址

    千次阅读 2018-06-21 07:06:00
    80386虚拟地址物理地址转换CPU的发展之前在看malloc内存分配函数的原理时,有涉及分配虚拟内存,然后再映射到物理内存,当初也是看得一头雾水,因为对虚拟内存和物...
  • linux内核采用页式存储管理。...2.要将一部分物理地址的空间的内容转换磁盘上的时候,在段式存储管理中要将整个段(通常来说很大)都换出来,而在页式管理中则是按页进行的,效率要高很多。linux内核设计的段...
  •  本文将用一个小例子说明如何在32位cpu下手工将虚拟地址转换内存中的物理地址。(32位xp下测试通过,32位win7不知何因就是不行。大牛若知,请指点,不胜感激。)  首先补充下理论知识:   验证思
  • 计算机中的存储层次结构都是在考虑性价比的前提条件下尽量满足程序员的这一需求,其中虚拟地址的产生在其中起了至关重要的作用:它允许程序员不用考虑物理内存的使用情况而任意使用整个内存空间(CPU地址总线决定...
  • 地址翻译:从虚拟地址到物理地址

    千次阅读 2013-09-05 23:21:11
    1.名词释义 ---------------------------------- VA:虚拟地址 PA:物理地址 ...磁盘上数组的内容被缓存主存中,磁盘上的数据被分割为块,即虚拟页VP,作为磁盘和主存之间的传输单元。类似的,物理存储器被
  • ARMV8 MM之物理地址/虚拟地址映射

    千次阅读 2018-04-18 23:21:21
    ARMV8 MM之物理地址/虚拟地址映射 对于CPU来说,如果没有启动MMU,那么CPU...本文主要介绍ARMV8虚拟地址到物理地址的映射方案。 1. Translation stage ARMV8支持两个stage的地址转换,分别是stage1和stage...
  • Linux 内核 虚拟地址 物理地址 转换

    千次阅读 2015-12-12 15:10:02
    剩下的1G-896=128M范围的虚拟地址可以映射任意物理地址.称为内核虚拟地址.当实际内存大于1G时(实际上是> 896M时),用这块地址空间做映射. 实际的计算机体系结构有硬件的制约,这限制了页框可以使用的方式。尤其
  • Linux虚拟地址物理地址的转换

    千次阅读 2018-06-27 23:46:43

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 388,094
精华内容 155,237
关键字:

虚拟地址到物理地址