精华内容
下载资源
问答
  • 动态地址映射是在程序
    千次阅读
    2019-09-04 17:10:46

    一、地址映射

    .class文件→ jvm → linux

    用【javap -c 字节码名】 可以打印出jvm的指令,最终转成linux系统平台的汇编指令来执行

    c/c++,java,python,php,go语言都是指令(text)和数据(data)

    • 在程序还没有运行之前,实际上程序的指令和数据的地址都已经分配好了,但是这个指令或者数据的地址是实际的物理地址吗?
      答: 不是! 程序的指令和数据所分配的地址不会是物理地址,他们都是虚拟地址(IBM)
      程序指令和数据分配的地址 = 虚拟地址 = 虚拟地址空间上的地址
      在这里插入图片描述

    二、映射过程

    • 代码运行前,编译生成的指令和数据,地址已经分配好了,(编译的时候,函数和数据的地址是一定要分配的,否则汇编指令没法生成无法形成函数的调用关系和数据的运算关系),但是在程序没运行之前又不知道将来会在哪一块物理内存上运行,所以此时给指令或者数据分配的地址都是虚拟地址——(虚拟地址空间上的地址,linux系统会给每一个进程都分配一个虚拟地址空间,各个进程所能使用的虚拟地址范围都是一样的)

    • 当执行当前进程的时候,CPU开始执行当前进程的指令,或者做全局数据的初始化,或者在执行指令过程中,要访问数据都得去内存上取指令或者数据!!!那么不可能直接从发指令和数据的虚拟地址来定位他们在物理内存上的位置,此时要用虚拟地址——物理地址的地址映射

    • 由MMU和Linux系统共同完成地址映射,Linux系统负责提供该进程映射所需要的页目录和页表内容,MMU负责具体的映射计算过程,MMU会先把虚拟地址分成10位(pdindex),10位(ptindex),12位(offset)三份。第一个10位表示页目录的下标,第二个10位表示页表的下标,第三个12位表示在物理页面上的偏移量。

    • PD(pdindex) → PT的地址
      PT(ptindex) →一个物理页面的起始地址
      一个物理页面的起始地址+offset = 指令或者数据最终所在的物理内存的位置。
      页目录里存放的是2^ 10 个页表的下标,页表里存放的是2^10 个物理页面的下标,通过发来的指令或者数据一一映射到对应的物理页面,再加上低12位的偏移量表示最终所在的物理内存的位置。

      linux32位操作系统:2^10 * 2^10 * 2^12 = 1024 1024 4096 = 4G

    • 程序启动,任何的物理内存都没有分配,进程只有一个页目录,开始进行地址映射的时候,会不断产生缺页异常,转入缺页异常处理程序,发现导致地址映射失败的原因(是页目录项中没有分配页表,还是页表项中没有分配物理页面…) 然后进行相应的资源分配,重启地址映射过程,最终映射成功。

    更多相关内容
  • Cache地址映射

    万次阅读 多人点赞 2018-09-01 15:17:35
    理解Cache地址映射之前补充一些基础知识,Cache的地址映射和MMU(内存管理单元)和TLB Cache(转译查找缓存)中的映射是有区别的。Cache、TLB Cache、MMUCPU中结构如图1所示,图1展现的是Cortex A9 Processor内部...

      理解Cache地址映射之前补充一些基础知识,Cache的地址映射和MMU(内存管理单元)和TLB Cache(转译查找缓存)中的映射是有区别的。Cache、TLB Cache、MMU在CPU中结构如图1所示,图1展现的是Cortex A9 Processor内部结构,采用的指令和数据总线分开的哈佛结构。CPU访问内部存储和外部存储,以及各种外设空间在硬件层面上看都是物理地址(硬件总线),然后为了满足多进程脆弱的软件系统提出了虚拟地址,虚拟地址是针对应用程序所提出的概念,MMU负责虚拟地址到物理地址的映射工作,从虚拟地址到物理地址的转换过程可知:页表存储在内存中,使用一级页表进行地址转换时,每次读/写数据需要访问两次内存,第一次访问一级页表获得物理地址,第二次才是真正的读/写数据;使用两级页表时,每次读/写数据需要访问三次内存,访问两次页表(一级页表和二级页表)获得物理地址,第三次才是真正的读/写数据,由于这种机制速率很慢,才提出TLB Cache用于存储近期用到的页表条目(段/大页/小页/极小页描述符。TLB Cache是一个内存管理单元用于改进虚拟地址到物理地址转换速度的高速缓存,位于MMU中,本文章不深入分析MMU和TLB。Cache映射是硬件层面物理块与物理块之间建立的联系。

                                                                                                                         图 1

    Cache的容量一般都很小,即使是最大的三级CacheL3)也只有20MB30MB。而当今内存的容量都是以GB作为单位CPU对存储器的访问,通常是一次读写一个字单元。当CPU访Cache不命中时,需将存储在主存中的字单元连同其后若干个字一同调入Cache中,之所以这样做write-back策略才会有这种机制),是为了使其后的访存能在Cache中命中。因此,主存和Cache之间一次交换的数据单位应该是一个数据块(以前文章中提到的cache line,一般大小为64 Byte)。数据块的大小是固定的,由若干个字组成,且主存和Cache的数据块大小是相同的。

    从Cache-主存模型来看,一方面既要使CPU的访存速度接近于访Cache的速度,另一方面为用户程序提供的运行空间应保持为主存容量大小的存储空间。在采Cache-主存层次的系统中,Cache对用户程序而言是透明的,也就是说,用户程序可以不需要知道Cache的存在。因此,CPU每次访存时,依然和未使用Cache的情况一样,给出的是一个主存地址。但在Cache-主存层次中,CPU首先访问的是Cache,并不是主存。为此,需要一种机制将CPU的访主存地址转换成访Cache地址。而主存地址与Cache地址之间的转换是与主存块与Cache块之间的映射关系紧密联系的如何把内存中的内容存放到Cache中去这就需要一个映射算法和一个分块机制。

    分块机制就是说,Cache和内存以块为单位进行数据交换,块的大小通常以在内存的一个存储周期中能够访问到的数据长度为限。当今主流块的大小都是64字节,因此一个Cache line就是指 64 个字节大小的数据块。Cache容量模型如图 2所示,图中展现了data cache: 32-KB, 8-way set associative(每个组里有8行),64-byte line size的cache容量模型。

                                                                                                                                图 2

    映射算法是指把内存地址空间映射到Cache地址空间具体来说,就是把存放在内存中的内容按照某种规则装入到 Cache 中,并建立内存地址与 Cache 地址之间的对应关系。当处理器需要访问这个数据块内容时,则需要把内存地址转换成 Cache 地址,从而在Cache 中找到该数据块,最终返回给处理器。Cache 和内存之间的映射关系可以分为三类:全关联型Cachefull associative cache),直接关联型 Cachedirect mapped cache),组关联型 CacheN-ways associative cache)。

    全相联映射是指主存中任一块都可以映射到Cache中任一块的方式,也就是说,当主存中的一块需调入Cache时,可根据当时Cache的块占用或分配情况,选择一个块给主存块存储,所选的Cache块可以是Cache中的任意一块。例如,设Cache共有m块,主存共有n块,当主存的某一块j需调进Cache中时,它可以存入Cache的块0、块1、…、块i、… 或块m的任意一块上,如图3所示,区别在于cache和主存块的对应关系不一样。

                                                                                                               图3

     

    Cache中,需要建立一个目录表,目录表的每个表项都有三部分组成:内存地址、Cache块号和一个有效位。当处理器需要访问某个内存地址时,首先通过该目录表查询是否该内容缓存在Cache,具体过程如图4所示。当一个主存块调入Cache中时,会同时在一个存储主存块号和Cache块号映射表的相联存储器中进行登记。CPU访存时,主存的块地址A在Cache的相联存储器目录表中进行查询,如果找到等值的内存块地址,检查有效位是否有效,只有有效的情况下,才能通过Cache块号在Cache中找到缓存的内存,并且加上块内地址 B,找到相应数据,这时则称为Cache命中,处理器拿到数据返回;否则称为不命中,处理器则需要在内存中读取相应的数据。使用全关联型 Cache,块的冲突最小,Cache的利用率也高,但是需要一个访问速度很快的相联存储器。随着Cache容量的增加,其电路设计变得十分复杂,因此只有容量很小的Cache才会设计成全关联型

                                                                                                                                图 4

    直接关联型Cache是指主存中的一块内存只能映射到Cache的一个特定的块中Cache的目录表只有两部分组成:区号和有效位。其查找过程如图5所示。首先,内存地址被分成三部分:区号A、块号B和块内地址C,在这里区号A和区号B其实是全关联型中主存地址A。根据区号A在目录表中找到完全相等的区号,并且在有效位有效的情况下,说明该数据在Cache中,然后通过内存地址的块号B获得在Cache中的块地址,加上块内地址C,最终找到数据。如果在目录表中找不到相等的区号,或者有效位无效的情况下,则说明该内容不在Cache中,需要到内存中读取。直接相联映射方式的优点 是比较电路最简单,但缺点是Cache块冲突率较高,从而降低了Cache的利用率。

                                                                                                                          图 5

    以上两种方式各有优缺点,而且非常有趣的是,它们的优缺点正好相反,所以组关联型映射就出现了,组关联型映射是目前用的最多的映射方式。组关联型Cache内存被分为很多组,一个组的大小为多个Cache line的大小,一个组映射到对应的多个连续的Cache line,也就是一个Cache组,并且该组内的任意一块可以映射到对应Cache组的任意一个。可以看出,在组外,其采用直接关联型 Cache 的映射方式,而在组内,则采用全关联型Cache 的映射方式

    假设有一个4路组关联型Cache,其大小为1M,一个Cache line的大小为64B,那么总共有16KCache line,但是在4路组关联的情况下,我们并不是简简单单拥有16KCache line,而是拥有了4K 个组,每个组有4Cache line。一个内存单元可以缓存到它所对应的组中的任意一个Cache line中去。图 64路组关联型 Cache 为例介绍其在Cache中的查找过程。目录表由三部分组成,分别是“区号+块号”、Cache块号和有效位。当收到一个内存地址时,该地址被分成四部分:区号A、组号B、块号C和块内地址D。首先,根据组号 B 按地址查找到一组目录表项,在4 路组关联中,则有四个表项,每个表项都有可能存放该内存块;然后,根据区号A和块号C在该组表项中进行关联查找(即并行查找,为了提高效率),如果匹配且有效位有效,则表明该数据块缓存在 Cache 中,得到Cache块号,加上块内地址D,可以得到该内存地址在Cache中映射的地址,得到数据;如果没有找到匹配项或者有效位无效,则表示该内存块不在Cache中,需要处理器到内存中读取。

                                                                                                                                图 6

     

                                                                       本文出自Herok,欢迎关注公众号:herok,定期推送技术干货!!

    展开全文
  • 地址映射

    千次阅读 2017-08-28 13:30:02
    1. 相关概念 2. 地址映射图解

    1.     相关概念

            a.    地址映射:为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址的过程。

            b.    总线:总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为

            数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。

                           

            c.     cpu位数:cpu算数逻辑单元ALU一次处理数据的宽度。

            d.     8086 与 80386 的寄存器种类汇总表 

                 

           30386寄存器详解 https://linux.cn/thread/9685/1/1/

    2.     地址映射图解

    3.     相关问题

             a.   虚拟内存是什么?80386引入虚拟内存有什么好处?虚拟地址空间构成图

                   虚拟内存是计算机系统内存管理的一种技术。

                   好处:(1)   提升读写安全性  (2)  是的每个进程都有自己的独立地址空间  (3)   解决因地址不连续带来的不便。 (4)   更大程度的利用内存,增强CPU利用率。

                   虚拟地址空间结构图:

         

             b.   缺页异常的原因是什么

                  (1)   访问的线性地址不在虚拟空间中,

                  (2)   访问的线性地址在虚拟空间,但没有访问权限,

                  (3)   有访问权限,但没有建立映射关系

                  (4)   有映射关系,但页面不在内存中,

                  (5)   页面在内存中,却没有访问权限,

                  (6)   异常发生在“内核动态映射空间”,即进程在进入内核后,访问一个通过vmalloc()获得的线性地址而发生的异常。需要将内核页目录表、页表中对应的映射关系

                  拷贝到进程的页目录表和页表中,来解决。

             c.   交换分区,页置换算法

                  交换分区:在物理内存使用完之后,将磁盘空间(SWAP分区)虚拟成内存来使用。它是一段连续的磁盘空间,并且对用户不可见。

                     详述http://blog.csdn.net/wangsifu2009/article/details/6757352

                        http://www.cnblogs.com/kkkkkk/p/5524208.html

              

    
    
    展开全文
  • 1.x86体系32位linux内核/操作系统下:每一个进程运行的时候,系统会为其分配一个以上构造的4G的虚拟地址空间:3G为用户空间(私有)1G为内核空间(共享)代码段:存放程序的执行代码,大小运行前已经确定,也...
    1.在x86体系32位linux内核/操作系统下:
    每一个进程在运行的时候,系统会为其分配一个以上构造的4G的虚拟地址空间:
    3G为用户空间(私有)1G为内核空间(共享)
    代码段:存放程序的执行代码,大小在运行前已经确定,也包含一些只读的常数变量,例字符串常量等。
    数据段:存放程序中已初始化的全局变量(静态分配内存)。
    堆区:用于存放进程运行中被动态分配的内存段,大小不固定,可动态扩张或缩减。
          当进程调用malloc等函数分配内存,新分配的内存被动态添加到堆
          当利用free等函数释放内存时,内存从堆中剔除
    栈区:用于存放程序临时创建的局部变量,即函数括弧"{}"中定义的变量。
          函数被调用时,其参数也会被压入发起调用的进程栈中,并且调用结束后,函数的        返回值也会被存放回栈中。(由操作系统分配,内存的申请和回收都有OS管理)
    2.编译过程
    .o/.obj文件为什么不能运行?
    .o文件符号表里的符号,还没分配地址
    3.链接过程
    (1)所有.o文件的段进行合并,其中包含合并符号表,进行[符号解析]
         解析正确,给符号表的符号分配虚拟地址
    (2)进行[符号重定向] --> 把它们都替换成正确的虚拟地址
         -->exe(Windows)
              elf(Linux)
    符号解析:未定义的符号,找到其定义的地方
    运行时:代码段、数据段
            不用符号表段(因为有了正确的地址,要不要都无所谓)
    4.IA32体系虚拟地址映射
    为什么不直接分配物理内存?
    如果直接分配物理内存,有可能最终分配的地址被别人占用了
    因为不知道哪块物理内存空闲。
    第1次页面映射一定失败(在操作系统里)-->缺页异常
    怎么解决?  分配相应的物理内存
    缺页异常处理完成之后-->重启地址映射-->成功
    展开全文
  • 虚拟地址到物理地址映射

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

    千次阅读 2019-03-05 21:07:07
    在程序的执行过程中,Cache与主存的地址映射是由硬件自动完成的。
  • MMU地址映射过程详细

    千次阅读 2018-07-11 20:54:14
    2)MMU功能:地址映射(VA->PA),内存访问权限控制; 3)虚拟地址到物理地址的转换过程:Micro TLB->Main TLB->Page Table Walk 址映射过程详述 参考《ARM1176 JZF-S Technical Reference ...
  • 现代操作系统中,多任务已是标配。多任务并行,大大提升了 CPU 利用率,但却引出了多个进程对内存操作的冲突问题,虚拟内存概念的提出就是为了解决这个问题。 操作系统有一块物理内存(中间的部分),有两个进程...
  • Cache – 主存的地址映射及相关计算问题

    万次阅读 多人点赞 2016-12-29 11:12:30
    对于Cache,即高速缓存,是用来解决主存与CPU速度不匹配问 题,Cache的出现使得CPU可以不直接访问主存而直接与...由于程序访问的局部性原理可以很容易设想只要将 CPU近期要用到的程序和数据提前从主存送到Cache,那么就
  • STM32芯片里面有什么 ...芯片生产厂商(SOC)如ST、TI、Freescale,负责内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如GPIO、USART(串口)、I2C、SPI等都叫片上外设。具体
  • Cache-主存地址映射

    千次阅读 多人点赞 2020-03-31 23:14:02
    目录一.涉及知识点1.三种地址映射方式2....我们所说的地址是指的存储单元的个数,即地址线可寻找的地址。关于存储容量的理解,可用下述例子理解: 假设有100个房间,一个房间住一个人,为了找到某个人,就要给这...
  • linux内核地址映射

    千次阅读 2017-04-03 16:47:59
    Linux 操作系统和驱动程序运行内核空间,应用程序运行用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不...
  • 程序里的映射是什么意思?

    万次阅读 多人点赞 2016-10-08 16:27:54
    映射就是给一个对象(可以是变量、物体、等等)起一个唯一的别名。 例如java中的Map就是一个表达映射的类。...这个例子就是把编号9527映射到唐伯虎上,只需要告诉程序你要找编号9527,程序就能找到唐伯虎。这就是映射
  • 动态PDO数据映射解析

    千次阅读 2019-11-17 19:40:00
    动态PDO数据映射解析 CoE应用层是基于CANOpen的EtherCAT总线通信模式,而 CAN open通讯协议中 , 设备之间的通讯是通过交换通讯对象即 COB 来实现的 ,同时通讯子协议DS301中定义了四类通讯对象: PDO (Process ...
  • 一、直接映射 每个主存块只与一个缓存块相对应,映射关系式为: i = j mod C 或 i = j mod 2 C 其中,i为缓存块号,j为主存块号,C为缓冲块数。 映射过程: 主存地址高m位被分成了两部分:低c位指代Cache的字块地址...
  • 将内网地址映射为外网地址
  • Cache与主存之间的直接映射,全相联映射和组项联映射以及其地址变换 首先先解释一些比较基础的东西 1.cache是什么? Cache是高速缓冲储存器,位于CPU和主存之间,比较小,速度比较快。 2.为什么要有cache? Cache类似...
  • 浅析逻辑地址与物理地址映射关系

    千次阅读 2018-01-23 17:06:03
    逻辑地址具有地址变换功能的计算机中,访问指令给出的操作数。 物理地址:用于内存芯片级单元寻址,与CPU连接的地址总线相对应。 线性地址:逻辑地址和物理地址转换的中间层,即硬件平台页式转换前的地址。 ...
  • 虚拟地址空间映射到物理地址空间

    千次阅读 2018-09-07 09:06:45
    虚拟地址空间映射到物理地址空间参考如下  当处理器读或写入内存位置时,它会使用虚拟地址。作为读或写操作的一部分,处理器将虚拟地址转换为物理地址。通过虚拟地址访问内存有以下优势:  程序可以使用一系列...
  • iOS之深入解析文件内存映射MMAP

    万次阅读 热门讨论 2021-08-31 19:33:16
    inode address_space 上查找要请求的文件页是否已经缓存内核页高速缓冲中。如果存在,则直接返回这片文件页的内容; 如果不存在,则通过 inode 定位到文件磁盘地址,将数据从磁盘复制到内核页高速缓冲,...
  • 这篇博文可以你基本了解逻辑地址空间和物理地址空间的概念后,为增强理解可通过我画的示意图来理解,本文会深入一些概念,以达到全面掌握该映射关系的目的。画图不易鸭,点个赞再走呗(✿◡‿◡) 逻辑地址空间及...
  • vs2008创建的wcf 2.0的 iis访问svc时报错 解决 打开IIS管理器,出问题的网站上面 ...找到“处理程序映射”,添加svc2.0的程序映射 %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll
  • 地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序中的指令和数据进行修改的过程 将逻辑地址空间重定位到物理地址空间的时机有三... 这之前我一直对地址重定位的细节不是很了解。...
  • 通常都是不一样的,所以需要地址映射。 正好是从编程人员的角度看,(不考虑解释执行)程序总是经过源程序编译,连接,运行三个阶段。这个过程中,指令和数据就要调到内存。 地址捆绑的三种形式: 编译时:编译...
  • 内存映射原理

    千次阅读 2022-01-16 01:59:39
    处理器系统总线上看到的地址。 使用RISC(Reduced Instruction Set Computer RISC 精简指令集)的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间。有些处理器架构把分配给外围...
  • 当缓存接收到CPU发送来的主存地址后,只需根据中间c位字段(假设为00…01)找到缓存块1,然后根据字块1的”标记”是否与主存地址的高t位相符合,若符合且有效位为1(这里的有效位用来识别Cache存储块中的额数据是否有效...
  • Linux域名IP映射

    千次阅读 2022-04-05 18:11:38
    所谓本地域名IP映射,是指本地建立域名和IP之间的映射关系,无需通过域名解析服务器,直接本地进行域名解析。linux系统中,是通过文件/etc/hosts描述域名到IP映射的。 域名IP映射的书写格式 linux系统中,域名...
  • cache与主存的地址映射

    千次阅读 多人点赞 2016-05-04 08:59:39
     首先,地址映像是把主存的地址空间用某种方法映像到cache,即就是把主存的程序按照一定的方法装进cache中,并且会建立主存与cache的地址对应关系。  通常有5种方法来映射,包括全相联映射,直接映射,组相联映射...
  • IIS7.5中设置“处理程序映射”这个功能,来取消PHP 等脚本运行权限时候,出现如下提示 :不能此路径中使用此配置节,让人摸不到头脑![这里插入图片描述]...
  • 8086 系统地址映射

    千次阅读 2020-07-02 13:36:21
    8086 系统地址映射 8086 有 20 根地址线,支持 1 MB 的存储区域 低 640 KB 供 DOS 及应用程序使用,高 64 KB 供 BIOS 使用,其余保留 中断向量表(0000H~03FFH) 每个中断向量 4 个字节,一共 256 个,共占 1 KB ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,033,497
精华内容 413,398
热门标签
关键字:

动态地址映射是在程序