精华内容
下载资源
问答
  • 内存单元的地址编号规则
    千次阅读
    2021-07-26 04:40:57

    地址为一个无符号整数,为了书写方便和编程,在源程序中常用十六进制数或符号来表示一个存储单元的地址。每一个单元的地址称为字节地址,任何相邻两个单元组成一个字地址,按编址原则约定用其中一个较小的地址来表示字地址。一个字由两个字节组成,则低字节对应低地址,高字节对应高地址。

    存放在内存单元中的信息称为存储单元内容,按地址的表示类型,存储单元的内容分字节地址内容字地址内容和双字地址内容。

    d08b16cba2b3c2119460846cdac910f3.png

    扩展资料

    存储地址用十六进制数表示,而每一个存储器地址中又存放着一组二进制(或十六进制)表示的数,通常称为该地址的内容。存储单元的地址和地址中的内容两者是不一样的。前者是存储单元的编号,表示存储器总的一个位置,而后者表示这个位置里存放的数据。正如一个是房间号码,一个是房间里住的人一样。

    如果机器字长等于存储器单元的位数,一个机器字可以包含数个字节,所以一个存储单元也可以包含数个能够单独编址的字节地址。例如一个16位二进制的字存储单元可存放两个字节,可以按字地址寻址,也可以按字节地址寻址。当用字节地址寻址时,16位的存储单元占两个字节地址。

    参考资料来源:百度百科-存储单元

    参考资料来源:百度百科-存储单位

    更多相关内容
  • STM32--MPU内存保护单元(一)

    千次阅读 2022-03-22 11:32:02
    MPU:Memory Protection Unit,内存保护单元(本文描述的内容); MPU:Microprocessor Unit,微处理器; MPU-6050 陀螺仪 跟这个就更是差了十万八千里了 所以请不要搞混 MPU MPU,即内存保护单元,可以设置不同存储...

    先说明一下MPU,MPU有很多含义,我们常见的有:

    MPU:Memory Protection Unit,内存保护单元(本文描述的内容);

    MPU:Microprocessor Unit,微处理器;

    MPU-6050 陀螺仪 跟这个就更是差了十万八千里了

    所以请不要搞混

    STM32–MPU内存保护单元(二)

    MPU

    MPU,即内存保护单元,可以设置不同存储区域的存储器访问特性(如只支持特权访问全访问)和存储器属性(如可缓存、可缓冲、可共享),对存储器(主要是内存和外设)提供保护,从而提高系统可靠性

    通过这些规则可以实现如下功能

    • 防止不受信任的应用程序访问受保护的内存区域。
    • 防止用户应用程序破坏操作系统使用的数据。
    • 通过阻止任务访问其它任务的数据区。
    • 允许将内存区域定义为只读,以便保护重要数据。
    • 检测意外的内存访问。

    也就是内存保护、外设保护和代码访问保护 设置一段内存是只读,还是只允许高权限访问,还是禁止访问等

    MPU可以保护的区域为内存映射区 memory map

    内存映射区就是 32 位的 CM7 内核整体可以寻址的 0 到 2^32 -1 共计 4GB 的寻址空间。通过这些地址可以访 问 RAM、Flash、外设等。下面是内存映射的轮廓图,IC 厂家使用时,再做细分,添加相应的硬件功能

    在这里插入图片描述

    也就是说 MPU可以保护我们的保护内存区域(SRAM 区)不受非法干扰,也可以保护我们的外设区(比如 FMC)

    MPU 区域(region)

    STM32H7 的 MPU 提供多达 16 个可编程保护区域(region)每个区域最小要求 256 字节,序号范围是 0 到 15, 每个区域(region)还可以被进一步划分为更小的子区域(sub region),每个区域(region)都有自己的可编程起始地址、大小及设置。

    这些内存区可以嵌套和重叠,所以这些区域在嵌套或者重叠的时候有个优先级的问题。MPU 可以配置的 16 个内存区的序号范围是 0 到 15,序号15 的优先级最高,以此递减,还有默认区 default region,也叫作背景区,序号-1,即背景区的优先级最低。这些优先级是固定的

    MPU 功能必须开启才会有效,默认条件下,MPU 是关闭的

    MPU在执行其功能时,是以“region区域”为单位的。一个region其实就是一段连续的地址,只是它们的位置和范围都要满足一些限制(对齐方式,最小容量等)

    MPU 区域(region)优先级

    MPU 定义的区域(region)还可以相互交迭。如果某块内存落在多个区域(region)中,则访问属性和权限将由编号最大的 region 来决定。比如,若 3 号 region 与 5 号 region 交迭,则交迭的部分受 5 号 region 控制

    比方说5号区域(region)内存是只读模式, 3 号 region内存是读写模式 那么重叠的部分就变成了只读模式,如果对其写入数据则会报错

    在这里插入图片描述

    MPU背景区

    MPU在Region区域之外,还允许启用一个背景区域(即没有MPU 设置的其他所有地址空间),上面图片的空白存储区域。背景区域只允许特权访问。在启用 MPU 后,就不得再访问定义之外的地址区间,也不得访问未经授权的区域(region),否则,将以“访问违例”处理,触发 MemManage 异常

    具体的我们在寄存器中讲解,你就会有一个清晰的了解。


    MPU 设置是由 CTRL、RNR、RBAR 和 RASR 等寄存器控制的,其中最主要的就是RASR寄存器,下面我们来一一介绍

    1.MPU 控制寄存器(CTRL),该寄存器只有最低三位有效

    在这里插入图片描述

    • PRIVDEFENA 位用于设置是否开启背景区域(region),通过设置该位为 1 即可打开背景区
    • HFNMIENA 位用于控制是否在 NMI 和硬件 fault
    • ENABLE 位,则用于控制是否使能 MPU

    如果PRIVDEFENA 设置为0 那么就只能访问MPU的设置的内存区域,如果访问其他地址就会报错

    2.MPU 区域编号寄存器(RNR)在这里插入图片描述
    该寄存器只有低 8 位有效 可以读写

    在配置一个区域(region)之前,必须先在 MPU 内选中这个区域,我们可以通过将区域编号写入 MPU_RNR 寄存器来完成这个操作。该寄存器只有低 8 位有效,不过由于 STM32H7最多只支持 16 个区域,所以,实际上只有最低 4 位有效(0~15)。在配置完区域编号以后,我们就可以对区域属性进行设置了。

    也就是设置要配置那个一内存区域(region)

    3. MPU 区域属性和容量寄存器(RASR)
    在这里插入图片描述
    该寄存器是一个32位的寄存器 其中31:29位 27位 23:22位保存,没有作用

    • XN(28位):用于控制是否允许从此区域提取指令,如果 XN=1,说明禁止从区域提取指令,即这块内存区禁止执行程序代码,如果设置XN=0,则允许提取指令 即这块内存区可以执行程序代码
    • AP 位(bit[26:24]),用于控制Region区域内数据的访问权限(访问许可)三位就对应8中情况

    具体设置如下:
    在这里插入图片描述

    注意: 下面的TEX,C,B 和 S 都是设置Cache高速缓存的,正常使用MPU是做内存保护,用上面的AP位即可,如果没有用到Cache,下面的配置有个了解即可,在HAL库配置的时候直接禁止,不会有任何影响

    如果对Cache不了解,具体可看:STM32H7—高速缓存Cache(一)

    TEX,C,B 和 S 的定义如下,这仅关注 TEX = 000 和 001,其它的 TEX 配置基本用不到。
    在这里插入图片描述

    • C位:用于使能或者禁止Cache
    • B位:用于配合C位实现Cache下是否使用缓冲
    • S位:用于位用于控制存储器的共享特性,S=1,则二级存储器不可以缓存(Cache),如果设
      置 S=0,则可以缓存(Cache),一般我们设置该位为 0 即可。

    按照配置的不同,总共可以分成以下四种:
    在这里插入图片描述

    read/write-through/back/allocate的区别:
    一、CPU读Cache

    1. Read through:直接从内存区读取数据
    2. Read allocate:先把数据读取到Cache中,再从Cache中读取数据

    二、CPU写Cache
    若hit命中,有两种处理方式:

    1. Write-through:在数据更新时,把数据同时写入Cache和存储区
      操作简单,但是写入速度慢
    2. Write-back:只有在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。
      写入速度快,但是一旦更新后的数据未被写入时出现断电,则数据无法找回

    若miss,有两种处理方式:

    1. Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush的方式写入到内存>中。
    2. No-write allocate:并不将写入位置读入缓存,直接把要写的数据写入到内存中。

    什么叫hit/miss:

    一、读操作
    如果CPU要读取的SRAM区数据在Cache中已经加载好,这就叫读命 中(Cache hit),如果Cache里面没有怎么办,这就是所谓的读Cache Miss。
    二、写操作
    如果CPU要写的SRAM区数据在Cache中已经开辟了对应的区域(专业词汇叫Cache Line,以32字节为单位),这就叫写命中(Cache hit),如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写Cache Miss。

    • SRD位: 用于控制内存区的子区域,一共有8bit,一个bit控制一个子区域,一般都开启
    • RegionSIZE位:配置Region内存区域的大小,最小为32位 可以为32kb 64kb 128kb等等

    4. MPU 基地址寄存器(RBAR)
    在这里插入图片描述

    • ADDR: Region内存区的首地址

    注意一定要保证首地址跟内存区的大小(RegionSIZE位)对齐,例如,我们定义某个 region 的容量(RegionSIZE位)是 64KB,那么它的基址(ADDR)就必须能被 64KB 整除,也就是这个地址对 64KB,即 0x00010000 求余数等于 0,比如0X0001 0000、0X0002 0000、0X0003 0000 等都可以被整除

    • VALID 区域编号是否覆盖,如果为1的话将会重新修改ADDR Region内存区的编号
    • REGION 段(bit[3:0]) : 新编号,四位地址对应(0~15)

    Region内存区的编号在初始化的时候就设置完成,所以一般VALID位设置为0

    关于MPU一些基本原理和寄存器就先探讨到这里,下一篇我们来看下HAL库里MPU的配置以及如何使用。

    STM32H7内存默认映射和属性

    在这里插入图片描述

    STM32H7 FMC地址

    在这里插入图片描述

    展开全文
  • 先补充一些知识8位十六进制=32位二进制字地址=存储字地址=存储单元地址1字节=8位二进制字(word)是一次存取,加工,传送的数据长度,字长是每个字所包含的位数,32位字长=4个字节32(字长)/8(bit)=4(字节)因此1个字=4个...

    本文写的很详细,搞了很久才理解这块的东西,如有错误请指出.

    为了方便理解,先补充一些知识

    8位十六进制=32位二进制

    字地址=存储字地址=存储单元地址

    1字节=8位二进制

    字(word)是一次存取,加工,传送的数据长度,字长是每个字所包含的位数,32位字长=4个字节

    32(字长)/8(bit)=4(字节) 因此1个字=4个字节

    大端和小端是指数据在内存中的存储模式,它由 CPU 决定:

    1) 大端模式(Big-endian)是指将数据的低位(比如 1234 中的 34 就是低位)放在内存的高地址上,而数据的高位(比如 1234 中的 12 就是高位)放在内存的低地址上.

    2) 小端模式(Little-endian)是指将数据的低位放在内存的低地址上,而数据的高位放在内存的高地址上。这种存储模式将地址的高低和数据的大小结合起来,高地址存放数值较大的部分,低地址存放数值较小的部分,这和我们的思维习惯是一致,比较容易理解。

    e329eb132b62c40ad4f1e0400f32fe03.png

    12345678H是8位十六进制(也就是8个16进制数),左边大端方式12所在的位置是低地址,1个十六进制数转化为二进制占4位,因为一个字节是8位二进制,因此一个格子里放2个十六进制数.

    列 字地址 0 4 8 ,实际是因为1个字=4个字节, 也就是0123(0)4567(4)891011(8)

    对16个格子进行编号,第一行第一个是0, 就像二维数组那样. 0就是最低位

    地址线和按字节寻址/按字寻址

    8496ead3c5e0c42a7cf0315b37a0b27b.png

    总线中的每根“线”,一次只能传输0/1,所以一根线能传输1位(bit)的数据,两根线呢,能传输2位(bit)。但是,需要注意的是1bit能表达0和1,所以1bit能表达2个数,所以,3bit能表达的数其实是2^3个,也就是8。

    地址线24根,按字节寻址范围为2^24 =16M;

    若字长32位,则一个字有4个字节,所以要留2根地址线指出该字中的哪个字节[00,01,10,11],即寻址范围为 2^24−2=4M;

    若字长16位,则一个字有2个字节,所以要留1根地址线指出该字中的哪个字节[0,1],即寻址范围为2^24−1=8M;

    展开全文
  • 内存的基础知识什么是内存,有何作用存储单元内存地址进程运行的基本原理,内存起到什么作用指令的工作原理逻辑地址vs物流地址(绝对地址)从写程序-->程序运行三种链接方式三种装入方式 什么是内存,有何作用 ...

    什么是内存,有何作用

    存储单元

    内存地址

    在这里插入图片描述
    在这里插入图片描述
    以上两张图呢,其实就生动形象可以来描述内存,内存是什么呢?其实内存就是用于存放数据的硬件。程序执行前,需要先把程序放到内存中才可以执行。

    在这里插入图片描述
    从上面这张图中呢,就可以生动形象的理解什么是内存。
    内存简单可以理解为:地址+存储单元
    好比我们进行住宿的时候,如何可以知道住在哪呢,那就会有房间号,通过房间号,就可以知道住在几楼,在哪个房间,所以说呢,这个时候,在内存中其实也是一样的,也可以通过地址可以找到存储数据的地方,那就是存储单元。内存中呢也有一个个的小房间,每个小房间可以理解为就是一个存储单元。

    计算机可以有多种编地址方式:

    • 如果计算机按照字节编址,则每个存储单元大小为1字节,即1B,即8个二进制位
    • 如果字长为16位的计算机按字编址,则每个存储单元为一个字,每个字的大小呢,即为16个二进制位。当然也会有32位和64的,这也就是我们平时所提到的32位操作系统和64位操作系统。

    了解一下常用的数量单位:
    在这里插入图片描述

    进程运行的基本原理,内存起到什么作用

    指令的工作原理

    进行的运行原理->指令

    此图片来描述指令执行过程
    我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址 存取数据。
    这个数据应该做什么样的处理。在上面这个例子中呢,指令中直接给出了变量x的实际存放地址(物理地址),但实际在生成机器指令的时候,并不知道该进程的数据会被放到什么位置。所以编译生成的指令中一般是使用的逻辑地址(相对地址)

    指令存储在程序段中的。
    对上图有更深刻的了解的话,也需要了解关于CPU的体系结构的相关知识。简单说一下:CPU主要包含运算器和控制器两大元件,当然也离开不了计数器,通用寄存器等器件
    了解CPU的核心元件,可以通过此链接来进行了解

    上面这张图呢,可能也需要了解的就是进程包含的内容,主要分为三部分

    1. 程序段
    2. 数据段
    3. PCB(程序控制模块)
      在上面图中也有进行表示

    逻辑地址vs物流地址(绝对地址)

    其实这个逻辑地址和物理地址也很容易理解
    逻辑地址呢就可以简单理解为打标签 每个人都有一个身份证,这个身份证🆔就是一个标签,来标识唯一性
    物理地址呢,也成为绝对地址,就是这个人具体居住在什么地方,就可以理解为你所居住的地点,在房管局进行备案的地址,通过此地址就可以找到你.
    Eg:宿舍四个人一起去旅行,四个人的学号为0,1,2,3
    住酒店的时候呢,给他们安排了4个房号相连的房间。四个人按学号递增次序入驻房间。比如 0,1,2,3号同学分别入住了5,6,7,8号房间。
    四个人的编号0,1,2,3其实就是个相对位置,也就是逻辑位置,而每个人入住的房间呢就可以称为绝对位置
    只要知道0号学生入住的哪个房间,就可以知道1,2,3号同学入住的房间是哪一个,因为 他们也都是有规则存在的,这里呢就是递增方式来进行存储。
    如果0号同学入住的房间号是N号,那M号同学入住的房间号呢,那肯定是N+M号房间。
    也就是说,只要知道各个同学的相对位置和起始房号,就一定可以计算出所有同学的绝对位置。 可以简单理解就是相对位置+起始房号就是这个同学所入住的房间
    在这个例子中的规则定义。
    如下图所示:
    在这里插入图片描述

    从写程序–>程序运行

    从写程序到程序运行呢,其实会经过很长的一个过程,学过高级语言的或者了解过高级语言的,我们都应该比较清楚的是,比如Java语言,就需要经过编译,然后解释程序来对进行进行解释等后续的链接装入等一系列操作,每一步的程序都是有其需要深究的意义所在,这也就是我们所需要掌握的原因,这样我们才可以更加清晰的理解清楚,为什么要这么做,这么做的原因是什么,来解决什么问题,这个问题是如何解决的,其实就可以更加清楚的认识到内存在其中起到了什么作用。

    下图是简单的高级语言到程序运行的转换流程图:
    在这里插入图片描述
    对上述的三个名词作下解释:

    1. 编译:由编译程序将用户的源代码编译成若干个目标模块(编译其实就是把高级语言翻译为机器可识别的语言,也就是机器语言)
    2. 链接:由链接程序将编译后的一组目标模块,以及所需要库函数链接在一起,形成一个完成的装入模块
    3. 装入:由装入程序将装入模块装入内存运行
      如果对Java高级语言有了解的,其实就间接的可以思考或者理解一下JVM在整个过程中是如何去做的这件事情,就会发现有异曲同工之妙
      当然C语言也不例外,其实C也提供了编译环境,编译程序,所以大致的流程都是相同的。
      到最后都是装入到内存中,才能进行程序的执行的。内存就起到了至关重要的作用,其实可能很多有人会去问,为什么非要存储到内存中才可以执行,会有这样的疑问?其实思想也是比较简单的,这可能要了解CPU和SRAM和DRAM的前世今生,以及CPU和内存以及磁盘的发展演变过程,其实都大致遵循了摩尔定律,就会对这个疑问有深入的理解了。有兴趣可以了解一下。
      SRAM和DRAM的前世今生
      关于CPU和内存的发展演变以及为什么会出现SRAM?又为什么需要内存的存在

    三种装入方式

    装入模块装入内存
    在这里插入图片描述
    指令1 就可以理解为装入模块获取到的物理地址中的起始地址+80就等于是物理地址,往80的位置写入1,0是起始地址,80是逻辑地址。在物理地址中,就可以知道往哪个存储单元中进行存放数据。
    可以简单这么通俗易懂的去理解装入程序去做的事情。
    装入分为三种装入方式:

    1.绝对装入(Absolute Loading Mode):

    在编译时,如果知道程序将驻留在内存的什么位置,那么,编译程序将产生绝对地址的目标代码。即按照物理内存的位置赋予实际的物理地址。例如,事先已知用户程序(进程)驻留在从R处开始的位置,则编译程序所产生的目标模块(即装入模块)便从R处开始向上扩展。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,故不须对程序和数据的地址进行修改。程序中所使用的绝对地址,既可在编译或汇编时给出,也可由程序员直接赋予。这个方式的优点:是CPU执行目标代码快。

    缺点:1)是由于内存大小限制,能装入内存并发执行的进程数大大减少
    2)编译程序必须知道内存的当前空闲地址部分和其地址,并且把进程的不同程序段连续地存放起来,编译非常复杂。由于程序

       因此,通常是宁可在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。
    
       如何把虚拟内存地址空间变换到内存唯一的一维物理线性空间?涉及到两个问题:
        一是虚拟空间的划分问题。
        二是把虚拟空间中已经链接和划分好的内容装入内存,并将虚拟空间地址映射内存地址的问题。即地址映射。
        地址映射就是建立虚拟地址与内存地址的关系。
    

    2.静态重定位(Relocation Loading Mode)

    绝对装入方式只能将目标模块装入到事先指定的位置。在多道程序环境下,编译程序不可能预知所编译的目标模块应放在内存的何处,因此绝对装入方式只适用于单道程序环境。
    这句话如何进行理解呢,绝对装入,是事先就知道内存地址的,可以由程序员来进行指定,因为是一个程序在跑,所以,这个时候可以进行制指定。
    但是问题来了,如果是多道程序环境呢,多道程序在跑着,这个在内存中驻留的位置如何来确定呢,如何去指定呢?你想去指定这个位置,但是呢,其他程序可能也会往这个位置上去写,这种情况肯定是不能被允许的,所以这个时候,就引发出了新的思考,那就是静态重定位的方式。通过这种思想来解决多道程序环境的问题,这也就是多道程序所引发的新问题,装入方面的问题。
    在多道程序环境下,所得到的目标模块的起始位置通常是从0开始的,程序中的其他地址也都是相对于起始地址计算的,此时应采用可重定位装入方式,根据内存的当前情况,将模块装入到内存的适当位置。起始这就是静态重定位的思想所在!

    我的理解就是,仅仅是在绝对装入的思想上,做了一些思想上的升级而已,可以结合我们平时项目的开发,之前的设计满足于当时的适用场景,但是随着需求的不断增加以及改变,之前的那一套不适用于这次的功能了,这个时候,就要对之前设计的进行方案设计。或者说,之前的设计,性能有瓶颈,或者是QPS TPS达不到一定的程序,这个时候呢,就要对技术实现方案进行改造,这个时候就需要进行方案升级,通过新的思想和技术方案来解决当前问题,其实套到这个静态重定位中,道理是一样的,绝对装入,解决不掉当前的多道程序的问题,就需要方案上的改变,然后通过静态重定位方式来解决这个问题,当然,引入一个新的技术方案出来,肯定也会产生新的问题。哲学上,就有提到,新事物的产生,必然会引发新问题的产生。所以说在设计的时候,就要解决这种问题,并进行规则的设定。

    静态地址重定位:即在程序装入对目标代码装入内存的过程中存在,是指在程序开始运行前,程序中指令和数据的各个地址均已完成重定位,即完成虚拟地址到内存地址映射。地址变换通常是在装入时一次完成的,以后不允许在改变。
    值得注意的是,在采用可重定位装入程序将装入模块装入到内存后,会使装入模块的所有逻辑地址与实际装入内存的物理地址不同。
    在这里插入图片描述
    例如,在用户程序的 1000 号单元处有一条指令LOAD 1,2500,该指令的功能是将 2500 单元中的整数 365 取至寄存器 1。但若将该用户程序装入到内存的 10000~15000号单元而不进行地址变换, 则在执行11000号单元中的指令时,它将仍从 2500 号单元中把数据取至寄存器1而导致数据错误。由图4-3 可见,正确的方法应该是将取数指令中的地址 2500 修改成 12500,即把指令中的相对地址 2500 与本程序在内存中的起始地址 10000 相加,才得到正确的物理地址12500。除了数据地址应修改外,指令地址也须做同样的修改,即将指令的相对地址 1000 与起始地址 10000 相加,得到绝对地址 11000。

    优点:无需硬件的支持
    缺点:1)程序重定位之后就不能在内存中搬动了;
    2)要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域中。

    3.动态重定位(动态运行时装入方式 Dynamic Run-time Loading)

    可重定位装入方式可将装入模块装入到内存中任何允许的位置,故可用于多道程序环境。但是这中方式并不允许程序运行时在内存中移动位置。因为,程序在内存中移动,意味着它的物理位置发生了变化,这时必须对程序和数据的地址(绝对地址)进行修改后方能运行。然而,实际情况是,在运行过程中它在内存中的位置可能经常要改变,此时就应采用动态运行时装入的方式。

    动态地址重定位:不是在程序执行之前而是在程序执行过程中进行地址变换。更确切的说,是把这种地址转换推迟到程序真正要执行时才进行,即在每次访问内存单元前才将要访问的程序或数据地址变换成内存地址。动态重定位可使装配模块不加任何修改而装入内存。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持,

    优点:1)目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;
    2)一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不是顺序相邻的,只要各个模块有自己对应的重定位寄存器就行。
    之所以进行重定位寄存器的引入的话,

    我的理解是:因为在运行阶段,需要动态实时的来进行地址的来回切换,而且每个资源模块的地址也可能在运行阶段会发生改变,这个时候,运行阶段,是非常频繁存在的,引入寄存器,可以在切换后对于相对应的指令或者地址标记到寄存器中,得以来提升整体的性能。自己的理解,如果有不对的地方,希望可以指出来。因为对于太底层的相关实现没有了解那么深入,只能停留在现阶段的基础上来去思考这些设计,各位大佬请指出。
    缺点:需要硬件支持。

    总结:
    程序的装入过程即地址变换过程,分为绝对地址装入,静态重定位装入和动态重定位装入。
    静态重定位即在装入前虚拟地址已经变换为绝对地址,装入后不再改变。
    动态重定位装入,则是在程序运行的时候再进行地址变换,即程序即使在内存内地址发生变化也不会像静态重定位那样受到影响。

    三种链接方式

    • 静态链接方式

    在目标模块装入内存之前进行链接,链接成一个装入模块(可执行文件)后不再拆开。

    • 装入时动态链接方式

    在目标模块装入内存时,边装入边链接。即在装入了一个目标模块后,发现其要调用的目标模块不在内存中,则由装入程序找到相应的外部模块并将其装入内存。

    相较于静态链接方式的优势:
    1).方便目标模块的修改和更新。
    2).便于实现目标模块的共享。

    • 运行时动态链接方式

    在程序执行时才将目标模块链接到装入模块中。即在程序的执行过程中,若发现被调用的目标模块未被装入内存时,则操作系统将立即找到该目标模块并将其装入内存,最后将其链接到调用这个目标模块的目标模块上。

    较于装入时动态链接方式的优势:
    有些目标模块可能并不会被程序执行(错误处理模块),但是装入时动态链接方式会将其链接到装入模块中,这显然是对性能的损害。但是运行时动态链接解决了这个问题。

    展开全文
  • 前面,我们用[0]、[bx]的方法,在访问内存的指令中,定位内存单元地址。本章我们主要通过具体的问题来讲解一些更灵活的定位内存的方法和相关的编程方法。我们的讲解将通过具体的问题来进行。
  • 前面,我们用[0]、[bx]的方法,在访问内存的指令中,定位内存单元地址。在这一篇博文中,我们主要讲解一些更灵活的定位内存地址的方法和相关的编程方法。   and 和 or 指令 and 指令:逻辑与指令,按位进行...
  • 1. 信息在计算机系统中的表示 ...由于计算机内是采用二进制编码表示,因此,在一般情况下,我们用“0”表示正号,“1”表示符号,符号位数放在数的最高位。 例如,比如我们有十进制数A= +91,B= -91,8位二.
  • 内存管理单元MMU

    2019-09-27 11:42:03
    参考文献: [1] 《嵌入式系统软件和操作系统》 本博客主要回答这几个问题: 1. 虚拟地址和物理地址有什么关系?...内存保护用来防止地址越界和防止操作越权。采用内存保护机制的每个应用程序都...
  • 它能保证资源的所有权,任务需要遵守一组由操作环境定义的、由硬件维护的规则,在硬件级上授予监视和控制资源程序的特殊权限。受保护系统主动防止一个任务使用其他任务的资源。因此使用硬件主动监视系统比协调加强的...
  • 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。 我们写个最简单的hello world程序,用gccs编译,再反编译后会看到以下指令: mov...
  • 内存的编址和寻址、内存对齐

    千次阅读 2020-05-09 20:34:33
    内存的编址和寻址、内存对齐 ...内存单元的2个概念:地址和空间是内存单元的两个方面。 2.关键:内存的编址以字节为单位 如果把内存比作大楼,那么一个个房间就是内存格子。其中格子的大小是固定的,即8bit。 3
  • 3)、[bx+idata]用一个变量和常量表示地址,可在一个起始地址基础上用变量间接定位一个内存单元。 4)、[bx+si]用两个变量表示地址 5)、[bx+si+idata]用两个变量和一个常量表示地址。 ----------- 程序:将小写转换...
  • 内存地址的计算方法

    万次阅读 多人点赞 2017-03-24 14:25:21
    内存是按字节编址的,所以单位是字节哈,1字节可是等于8位的。因为计算的范围一般比较小,所以就记住两个就够了。记住几个常用的2的10次方为1024即1KB 2的20次方=(2的10次方)的平方,即1MB就行了 如果要求更大的,...
  •  MMU(Memory Management Unit),内存管理单元,主要职责:将虚拟地址映射为物理地址,提供硬件机制的内存访问权限检查。MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访问权限的检查保护每个进程所用的...
  • I/O端口与内存地址

    千次阅读 2019-09-08 10:00:20
    存储器统一编址(存储器映像编址):在这种编址方式中,I/O端口和内存单元统一编址,即把I/O端口当作内存单元对待,从整个内存空间中划出一个子空间给I/O端口,每一个I/O端口分配一个地址码,用访问存储器的指令对I/O...
  • 1.1 and 和 or 指令 (1)and指令:逻辑与指令,按位进行与运算 (出现0则为0) (2)or指令:逻辑或运算,按位进行或运算 (出现1则为1) 1.2 ASCII编码解码 一个文本编辑过程中,就包含着按照 ASCI编码规则进行的...
  • 文章目录存储单元地址分配和数据的存储和排列方式(大端方式/小端方式)存储单元地址分配数据的存储和排列大端方式小端方式 存储单元地址分配和数据的存储和排列方式(大端方式/小端方式) 存储单元地址分配 ...
  • ASCII是一种编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。例:61H 表示“a”。 7.3以字符形式给出的数据 用’…’ 的方式指明数据时以字符的形式给出的,编译器把它们转化为相对应的ASCII吗。 ...
  • 内存编址

    千次阅读 2018-07-01 21:10:00
    在计算机系统中,存储器中每个单元的位数是相同且固定的,称为存储器编址单元...1、存储地址从AC000H到C7FFFH,则共有C7FFFH –AC000H + 1 = 1C000H = 112K如果内存地址按字(16位)编址,则共有112k * 16 位,假设该内存由...
  • or al,00100000b 将al的第5位设为1 ASCII码 文本编辑过程中,包含着按照ASCII编码规则进行的编码和解码。按下键盘的a键,计算机用ASCII码的规则对按键的信息进行编码,将其转化位61H存储在内存的指定空间。 字符...
  • 一、4GB地址空间的局限 首先我们还必须要先了解两个概念 其一是“物理内存”。...所谓编码就是对每一个物理存储单元(一个字节)分配一个唯一的地址号码,这个过程又叫做“编址”或者“地址映射”。这个过
  • 操作系统内存知识概括内存内存管理非连续...内存地址从0 开始,每个 地址对应一 个存储单元。 如果计算机“按字节编址”, 则每个存储单元大小为 1字节,即 1B,即 8个二进制位。 如果字长为16位的计算机 “按字编址
  • 第 3 章 内存管理

    2021-03-05 22:38:09
    第 3 章 内存管理 1、内存的基础知识 1.1、思维导图 1.2、什么是内存?...方案: 给内存的存储单元地址,一般都是按照字节进行编址 1.3、几个常用的数量单位 常用的存储计量单位 210 = 1K
  • 若计算机内存中有若干个内存单元,它们的地址编号从00H到FFH,则这些内存单元总共可存放的数据数量为:( B ) A.256 bit B.256 Byte C.255 KB D.255 Kb2. 计算机网络的最基本功能就是在网络中的计算机之间进行...
  • mpu内存保护单元寄存器种类及相关编程一些嵌入式系统使用多任务的操作和控制。这些系统必须提供一种机制来保证正在运行的任务不破坏其他任务的操作。即要防止系统资源和其他一些任务不受非法访问。嵌入式系统有专门...
  • 编号后还要进行使用 因而它有效的空间就会显得相形见绌 所以它必须进行更高效的内存管理机制 => 当我们需要的时候 (比如定义变量) 它会随机租借给该变量一个空余的内存单元--我们知道变量的大小单位是byte(下面会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,528
精华内容 31,011
热门标签
关键字:

内存单元的地址编号规则

友情链接: hengtang_v88.zip