内存地址_

内存地址 在计算中,内存地址是指由软件和硬件在各个级别使用的特定内存位置的引用。存储器地址是固定长度的数字序列,通常显示和处理为无符号整数[1]。这种数字语义本身基于CPU的特性(如指令指针和增量地址寄存器),以及像使用各种编程语言认可的数组一样使用存储器。 数字计算机的主存储器由许多存储单元组成,每个存储单元都有一个物理地址,它是一个代码,CPU(或其他设备)可以使用代码访问相应的存储单元,一般只有系统软件,即BIOS,操作系统和一些专门的实用程序(例如存储器测试器)使用机器代码操作数或处理器寄存器寻址物理存储器,指示CPU指示称为存储器控制器的硬件设备使用存储器总线或系统总线,或单独的控制,地址和数据总线来执行程序的命令。存储器控制器“总线由许多并行线组成,每个并行线由二进制数字(位)表示,总线的宽度以及可寻址存储单元的数量,以及每个单元中的位数在计算机中各不相同。 计算机程序使用内存地址来执行机器码,并存储和检索数据。在早期的计算机中,逻辑和物理地址相互对应,但是由于虚拟内存的引入,大多数应用程序不具备物理地址的知识。相反,他们使用计算机的内存管理单元和操作系统内存映射来寻址逻辑地址或虚拟地址;见下文。 大多数现代计算机都是字节寻址的。每个地址标识一个字节(8位)的存储。大于单个字节的数据可以被存储在一系列连续的地址中。存在可寻址的计算机,其中最小的可寻址存储单元恰好是处理器的单词,例如,Data General Nova小型计算机,德州仪器TMS9900和美国国家半导体IMP-16微型计算机使用16位字,并且存在许多使用18位字寻址而非字节寻址的36位大型计算机(例如PDP-10)给出了218个36位字的地址空间,大约1兆字节的存储空间。寻址内存的效率取决于用于地址的总线的位大小 - 使用的位数越多,计算机可用的地址就越多。例如,具有20位地址总线(例如Intel 8086)的8位字节可寻址机器可以寻址220(1,048,576)个存储器位置,或者一个MiB存储器,而32位总线(例如Intel 80386)寻址232个(4,294,967,296)位置或4个GiB地址空间;相反,一个36位字寻址机器一个18位地址总线地址只有218(262,144) 36位位置(9,437,184位),相当于1,179,648位8位字节或1152 KB或1.125 MiB-略多于8086。 一些较旧的计算机(十进制计算机)是十进制数字可寻址的。例如,IBM 1620的磁存储器中的每个地址都标识了一个六位二进制编码的十进制数字,由一个奇偶校验位,标志位和四个数字位组成,1620使用5位十进制地址,所以在理论上可能的最高地址是99,999,实际上,CPU支持20,000个存储单元,并且最多可以添加两个可选的外部存储单元,每个单元支持20,000个地址,总数为60,000(00000-59999)。 字大小是给定计算机体系结构的特征。它表示CPU可以一次处理的位数。包括嵌入式系统在内的现代处理器通常具有8,16,24,32或64位的字长;目前大多数通用计算机使用32位或64位。历史上已经使用了许多不同的尺寸,包括8,9,10,12,18,24,36,39,40,48和60比特。 通常,当提到现代计算机的字大小时,也会描述该计算机上地址空间的大小。例如,一台称为“32位”的计算机通常也允许32位内存地址;一个字节可寻址的32位计算机可以寻址232 = 4,294,967,296字节的内存,或者4千兆字节(GiB)。这允许一个存储器地址被有效地存储在一个字中。 但是,这并不总是成立。计算机的内存地址可能大于或小于它们的字大小。例如,许多8位处理器(例如MOS技术6502)支持16位地址 - 如果不支持,它们将被限制为仅256字节的内存寻址。 16位英特尔8088和英特尔8086支持通过分段进行20位寻址,从而允许他们访问1个MiB而不是64个KiB的内存。自Pentium Pro以来的所有英特尔奔腾处理器都包含支持将36位物理地址映射到32位虚拟地址的物理地址扩展(PAE)。 理论上,现代可字节寻址的64位计算机可以寻址264个字节(16个字节),但实际上,内存数量受CPU,内存控制器或印刷电路板设计的限制(例如物理内存连接器的数量或焊接存储器的量)。 存储程序计算机中的每个存储单元都保存某种二进制数或十进制数。它的解释,作为某些数据类型的数据或作为指令,以及使用是由检索和操作它的指令来决定的。 一些早期的程序员将说明和数据结合在一起作为一种节省内存的方式,当它很昂贵时:曼彻斯特标记1有40位字的空间来存储少量的数据 - 处理器忽略了一小段一个词 - 而且这经常被用作额外的数据存储。[病毒需要]像病毒这样的自我复制程序有时将自己视为数据,有时则视为指示。自修改代码现在一般不推荐使用,因为它使得测试和维护过程难以节省几个字节,并且由于编译器或处理器对机器状态的假设,也可能导致错误的结果,但仍然是有时故意使用,非常小心。 在现代多任务环境中,应用程序进程通常在其地址空间(或多个空间)中具有以下类型的内存块: 地址空间的某些部分可能根本没有映射。 计算机程序可以访问明确给出的地址 - 在低级编程中,这通常称为绝对地址,有时也称为特定地址,在高级语言中称为指针数据类型。但是程序也可以使用相对地址来指定相对于其他地方(基地址)的位置。还有更多的间接寻址模式。 将逻辑地址映射到物理和虚拟内存还会增加几个间接级别;见下文。 许多程序员更喜欢对内存进行寻址,因此代码空间和数据空间(参见上文)以及物理和虚拟内存(见下文)之间没有区别 - 换句话说,数字相同的指针指的是完全相同的字节的RAM。 但是,许多早期的计算机并不支持这种平坦的内存模型 - 特别是哈佛体系结构机器强制程序存储与数据存储完全分离。许多现代DSP(如摩托罗拉56000)都有三个独立的存储区域 - 程序存储,系数存储和数据存储。一些常用的指令会同时从所有三个区域读取 - 较少的存储区域(即使存储的字节总数相同)会使这些指令运行速度变慢。 早期的x86计算机使用基于两个数字组合的分段存储器模型地址:内存段和该段内的偏移量。 某些段隐含地被视为代码段,专用于指令,堆栈段或常规数据段。尽管使用方式不同,但细分市场并没有不同的内存保护措施来反映这一点。在平坦存储器模型中,所有段(段寄存器)通常设置为零,并且只有偏移量是可变的。

 


posted @ 18-10-11 07:11  作者:admin  阅读量:

powered by 摩臣2 @2014 RSS地图 html地图

Copyright 365建站 © 2013-2017 365建站器 版权所有