精华内容
下载资源
问答
  • 页式地址变换(虚地址转换为内存地址的计算方法)
    万次阅读 多人点赞
    2019-05-09 22:58:14

    页式地址变换

    虚地址结构

    虚地址是用户程序中的逻辑地址,它包括页号和页内地址(页内位移)

    区分页号和页内地址的依据是页的大小,页内地址占虚地址的低位部分,页号占虚地址的高位部分。

    • 假设页面大小为1024字节,虚地址占用2个字节(16位)

    虚地址转换为内存地址计算

    • 如果,虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出
    • 第一步,将虚地址转换成二进制的数;
    • 第二步,按页的大小分离出页号和位移量(低位部分是位移量,高位部分是页号);
    • 第三步,根据题意产生页表,将位移量直接复制到内存地址寄存器的低位部分;
    • 第四步,以页号查页表,得到对应页装入内存的块号,并将块号转换成二进制数填入地址寄存器的高位部分,从而形成内存地址。

    举例说明:
    1.有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、A、5块,试将虚地址0AFEH,1ADDH转换成内存地址。
    解:
    |页号|块号 |
    | 0 | 7 |
    | 1 | 9 |
    | 2 | A |
    | 3 | 5 |
    虚地址0AFEH转化为二进制数:0000 1010 1111 1110
    已知页大小是2kb,所以低位部分是11位,所以,w=010 1111 1110, p=0000 1=1
    根据页号与块号的排列 p=1时,块号为9,9的二进制数为1001,表首地址为0
    所以,MR=(首0)0100 1010 1111 1110(二进制)=4AFEH(16进制)

    同理可计算出1ADDH,大家动手试一试吧。答案会放在在评论区里。

    • 如果,虚地址以十进制数给出,那么就用公式进行计算。
    • 页 号(整除)=虚地址 / 页大小
      位移量(取模)=虚地址 mod 页大小
      根据题意产生页表;
      以页号查页表,得到对应页装入内存的块号
      内存地址=块号×页大小+位移量
    同样我们举例说明
    1. 有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、10、5块,试将虚地址7145,3412转换成内存地址。
      解:
      |页号|块号 |
      | 0 | 7 |
      | 1 | 9 |
      | 2 | A |
      | 3 | 5 |
      首先,已知虚地址7415,页大小为2kb
      计算 P=7145/2048=3
      W=7145mod2048=1001
      MR=5*2048+1001=11241
      所以虚地址7145的内存地址是:11241

    同样的,3412的内存地址请大家动手试一下,答案放在评论区。
    其实是很简单的东西,怕自己忘记计算方式,所以记录一下,各位大佬见笑了。

    更多相关内容
  • 虚地址转换为内存地址 虚地址的由来 什么内存需要虚地址,如果没有虚地址,那我们是怎么给作业划分内存空间的呢 刚开始是直接用物理地址,人们把内存分成2块,操作系统区和用户区,用户程序(作业/进程)放在用户...

    虚地址转换为内存地址

    虚地址的由来

    为什么内存需要虚地址,如果没有虚地址,那我们是怎么给作业划分内存空间的呢

    刚开始是直接用物理地址,人们把内存分成2块,操作系统区和用户区,用户程序(作业/进程)放在用户区,但是这时候的内存只能有一道用户程序,每条指令直接用物理地址计算,但是这样的带来的问题是并发低,不能同时作业

    后来,为了能在内存中装入多道程序,且这些程序之间又不会相互干扰, 于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式,但是这时候的内存当用户程序太大时,可能所有的分区都不能满足需求。——固定分区,还是用物理地址计算

    再后来,为了解决这个问题,提出可变分区分配,这种分配方式不会预先划分内存分区,而是在进程装入内存时, 根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因为划分的内存空间是动态的,我们不知道进程在内存中的起始地址,所以操作系统要记录内存的使用情况——空闲分区表/空闲分区链

    在这里插入图片描述

    此时划分给用户程序(作业/进程)是用一块连续地址的内存块,而且还没有引进虚地址(逻辑地址)概念

    但是,动态分区分配算法会产生大量外部碎片,有兴趣的可以去看下动态分区分配的四种算法,所以引入了非连续地址分配概念

    我们将内存空间分为一个个大小相等的物理块,同时将进程的逻辑地址空间也分为与内存物理块大小相等的一个个部分,称之页面,然后将页面塞进空闲的内存物理块中,可以不连续。那么问题来了,进程怎么知道它的页面塞到哪个物理块了呢,所以引入页表概念,页表用来记录每个页面在内存中的起始物理地址,一个页面对应页面中的一个页表项。

    此时,因为指令的物理地址是随进程页面(我们不知道它塞到哪了)动态改变的,但是有个地址是可以确定的——虚地址

    注意!!!
    注意!!!
    注意!!!

    虚地址就是逻辑地址

    逻辑地址定义:程序经过编译、链接 后生成的指令中指明 的是逻辑地址(相对地址),即:相对于进程的起始地址而言的地址

    虚地址转换

    现在我们知道进程每个页面对应的物理地址,但是页面中的某条指令的地址(页内偏移量)我们不知道,怎么算出来呢

    在这里插入图片描述
    举个例子

    Eg:在某计算机系统中,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址110 对应 的页号、页内偏移量是多少,实际的物理地址是多少?

    如何计算:
    页号 = 逻辑地址 / 页面长度 (取除法的整数部分)
    页内偏移量 = 逻辑地址 % 页面长度(取除法的余数部分)

    页号 = 110 / 50 = 2
    页内偏移量 = 110 % 50 = 10

    逻辑地址 可以拆分为(页号,页内偏移量)
    通过页号查询页表,可知页面在内存中的起始地址

    实际的物理地址 = 页面在内存中的起始地址+页内偏移量

    后面这种计算方式改成了二进制的左移右移,有兴趣的可以了解下

    • 逻辑地址的拆分更加迅速——如果每个页面大小为 2^k字节,用二进制数表示逻辑地址,则末尾 k位 即为页内偏移量,其余部分就是页号。
    • 物理地址的计算更加迅速——根据逻辑地址得到页号,根据页号查询页表从而找到页面存放的内 存块号,将二进制表示的内存块号和页内偏移量拼接起来,就可以得到最终的物理地址。
    展开全文
  • 易语言源码将idle内存转换为虚拟内存.rar
  • 将idle内存转换为虚拟内存。@易语言入门教程。
  • CPU只能访问虚拟内存,而实际的...据传送到CPU中进行运算,而这个地址的映射就通过页表来完成的。 --------------------------------------------------------------------------------- 一,linux内核的四级页表。
    CPU只能访问虚拟内存,而实际的数据都存放在物理内存上面,
    这就需要将虚拟内存映射到物理内存上面去,然后在物理内存上获取数
    据传送到CPU中进行运算,而这个地址的映射就通过页表来完成的。
    ---------------------------------------------------------------------------------
    一,linux内核的四级页表。
           内核为什么要设计四级页表呢?主要是为了支持多种硬件平台,
    各种CPU提供的硬件支持不一样,还有要支持64位机。内核的4级页表可
    以退化为3级页表,还可以退化到2级页表。四级页表也就是把一个虚拟
    地址分为了5部分,分别是PGD,PUD,PMD,PTE,offset
    示意图如下:

    ------------------------------------------------------------------------------
    二,实战,将一个用vmalloc开辟的地址映射为物理地址。

    1. static unsigned long vaddr_to_paddr(unsigned long va)
    2. {
    3.     pgd_t *pgd;
    4.     pud_t *pud;
    5.     pmd_t *pmd;
    6.     pte_t *pte;
    7.     unsigned long paddr;
    8.     unsigned long page_addr;
    9.     unsigned long page_offset;

    10.     pgd = pgd_offset(current->mm,va);
    11.     printk("pgd_val = 0x%lx\n",pgd_val(*pgd));
    12.     printk("pgd_index = %lu\n",pgd_index(va));
    13.     if (pgd_none(*pgd)) {
    14.         printk("not mapped in pgd!\n");
    15.         return -1;
    16.     }

    17.     pud = pud_offset(pgd,va);
    18.     printk("pud_val = 0x%lx\n",pud_val(*pud));
    19.     printk("pud_index = %lu\n",my_pud_index(va));
    20.     if (pud_none(*pud)) {
    21.         printk("not mapped in pud!\n");
    22.         return -1;
    23.     }

    24.     pmd = pmd_offset(pud,va);
    25.     printk("pmd_val = 0x%lx\n",pmd_val(*pmd));
    26.     printk("pmd_index = %lu\n",pmd_index(va));
    27.     if (pmd_none(*pmd)) {
    28.         printk("not mapped in pmd!\n");
    29.         return -1;
    30.     }

    31.     pte = pte_offset_kernel(pmd,va);
    32.     printk("pte_val = 0x%lx\n",pte_val(*pte));
    33.     printk("pte_index = %lu\n",pte_index(va));
    34.     if (pte_none(*pte)) {
    35.         printk("not mapped in pte!\n");
    36.         return -1;
    37.     }
    38.     

    39.     page_addr = pte_val(*pte) & PAGE_MASK;
    40.     page_offset = va & ~PAGE_MASK;
    41.     paddr = page_addr | page_offset;

    42.     printk("vaddr = %lx,paddr = %lx\n",va,paddr);
    43.     printk("page_addr = %lx\n",page_addr);
    44.     
    45.     return paddr; 
    46. }
    模块运行结果:(环境:linux.2.6.36,intel 32位系统)

    1. [263298.365202] pgd_val = 0x5e18067
    2. [263298.365207] pgd_index = 995
    3. [263298.365210] pud_val = 0x5e18067
    4. [263298.365213] pud_index = 0
    5. [263298.365216] pmd_val = 0x5e18067
    6. [263298.365218] pmd_index = 0
    7. [263298.365221] pte_val = 0x63c0163
    8. [263298.365223] pte_index = 127
    9. [263298.365226] vaddr = f8c7f000,paddr = 63c0000
    10. [263298.365229] page_addr = 63c0000
    可以看出pud和pmd的偏移量均为0,说明在这儿就只使用了二级页表,
    将pud和pmd都“折叠”起来了。代码的过程完全可以由上面的图解释。
    -----------------------------------------------------------------------------------------
    三,模块完整代码
     vaddr_to_paddr.rar   
    ------------------------------------------------------------------------------------------
    展开全文
  • 分页内存管理——虚拟地址到物理地址转换

    万次阅读 多人点赞 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,

      以此类推。

             

    展开全文
  • 在进程中,我们不直接对物理地址进行操作,CPU在运行时,指定的地址要经过MMU转换后才能访问到真正的物理内存地址转换的过程分为两部分,分段和分页。 分段机制简单的来说是将进程的代码、数据、栈分在不同的虚拟...
  • 虚拟地址与物理地址转换

    千次阅读 2021-05-10 23:30:38
    linux操作系统以页单位管理虚拟内存,通常一页4k,而物理内存是以块单位管理的,物理内存被分成很多与页大小相同的块,被称为页框,每个页地址与页框对应,这种对应关系被记录在页表中,页表是MMU中的数据结构...
  • 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。 first() {//检索快表 if(找到) { 修改页表项访问位 if(是写指令) { 修改位置"1"; } use(物理地址&&页...
  • 操作系统【分页系统 习题(逻辑地址、物理地址 转换)】
  • 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。 first() {//检索快表 if(找到) { 修改页表项访问位 if(是写指令) { 修改位置"1"; } use(物理地址&...
  • 一、连续分配方式缺点 连续分配方式的主要缺点是会形成许多碎片,...基本的分页存储管理方式不具备页面对换功能,也不支持实现虚拟存储器功能,它需要把每个作业全部装入内存后才能运行。 三、页面 分页存储管理是将
  • 多个程序交替访问内存地址可能冲突 且可能读到别的程序内存中的数据 如果程序很大内存容量可能不够 程序过多的话上面三个问题都会指数增长 所以要解决这样的问题: 要让每个程序有自己单独的房间(即有一个私有的从...
  • 今天学习了 分页机制中的 虚拟内存地址到物理内存地址转换,做些笔记。 首先也是非常需要注意的是这个 PAE ( 物理 地址 扩展),这个东西是默认开启的,由于 不开启 PAE 时候的计算要相对简单一些,所以从简单...
  • 在一个采用段页式存储方式的系统中,有16位虚地址空间,每个进程有2个段,页的大小B。段页表的内容如下表所示(表中数字均二进制数),并且段长以页单位。 计算回答: 对于下列十六进制虚地址,求它们转换后的...
  • 虚拟地址与虚拟内存的理解

    千次阅读 2019-04-16 10:38:00
    在最开始看书的时候,我知道程序在运行时,不是全部加入内存当中的,当然,这个现在依旧正确,在有了虚拟地址空间这个概念以后,我一直认为是在硬盘中划分出一块虚拟内存出来,然后给每个程序4G的硬盘空间,作为这个...
  • 虚拟地址转换为物理地址

    千次阅读 2014-07-24 19:10:47
    Linux采用页表的概念来管理虚拟空间,内核在处理虚拟地址时都必须将其转换为物理地址,然后处理器才能够访问。虚拟地址可以通过Linux的页表操作宏逐层查找到物理地址,简单来说需要将虚拟地址分段,每段地址都作为...
  • 1. 利用 crash 展示和解说一个虚地址经过页表逐级转换的过程 2. 分配内存,释放内存形成孔洞,记录该进程的虚存空间变化,验证进程空间的内存分配算法 3. 测试出你的系统单个进程所能分配到的最大虚拟内存空间多...
  • 说明: GDT:全局描述符表 LDT:局部描述符表 TI:标志位,0表示描述符在GDT,1表示描述符在LDT
  • 物理地址:加载到内存地址寄存器中的地址内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理...
  • 虚拟地址、线性地址和物理地址转换
  • 由于定题是MMU的地址变换过程,这里就不再叙述MMU的基本概念、内存访问顺序和使能和禁止MMU(Enabling and disabling the MMU)等内容。 本文主要参考 ARM Architecture Reference Manual的Chapter B3 以及校内课件...
  • PCIe地址转换服务(ATS)详解

    千次阅读 多人点赞 2021-09-11 23:33:06
    PCIe地址转换服务(ATS)详解
  • 文章目录目录什么需要虚拟内存?Linux 内核的虚拟内存 什么需要虚拟内存? 在现代操作系统中,多任务已是标配。多任务并行,大大提升了 CPU 利用率,但却引出了多个进程对内存操作的冲突问题,虚拟内存概念的...
  • 进程地址空间(虚拟地址 | 物理内存

    千次阅读 多人点赞 2021-03-17 20:45:37
    2. 什么要有地址空间?3. 地址空间是如何工作的?四、一些补充 前言 在之前的学习中,我们只学习了图中的下半部分(用户空间),当时还并未涉及到操作系统。 我们写一段代码来验证一下这张图。 #include<...
  • 2、输入块(页)的大小,通过模拟位示图本作业分配内存空间建立相应的页表(长度不定); 3、录入逻辑地址转换成相应的物理地址 4、扩充页表,变成请求式的二维页表(增加存在位等)完成地址转换。 5、输入分配给...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,666
精华内容 27,866
关键字:

虚地址转换为内存地址

友情链接: rfykaqpw.zip